您的位置:首页 > 其它

WF4.0 基础篇 (二十二) Tracking

2013-10-13 16:34 886 查看

Tracking 介绍

WF跟踪是用来记录工作流执行情况

WF跟踪由以下几部分组成:

跟踪记录

Tracking Records
从工作流运行时发出

跟踪配置

Tracking Profile
用来筛选从工作流实例中发出的跟踪记录

跟踪参与者

Tracking Participants
用来订阅跟踪记录。跟踪参与者包括处理来自跟踪记录的负载的逻辑

ActivityInfo
System.Activities.Tracking.ActivityInfo



TrackingProvider
System.Activities.Tracking.TrackingProvider



跟踪记录 TrackingRecord

跟踪记录[TrackingRecord]

DLL:System.Activities.dll

类名:System.Activities.Tracking.TrackingRecord



TrackingRecord为[Abstract],WF4自带了以下功能[TrackingRecord]





CustomTrackingRecord

可在Activity中使用[context.Track(CustomTrackingRecord)]方式添加自定义跟踪记录

跟踪配置 TrackingProfile

跟踪配置[TrackingProfile]

DLL:System.Activities.dll

类名:System.Activities.Tracking.TrackingProfile





Queries类型为[System.Collections.ObjectModel.Collection<System.Activities.Tracking.TrackingQuery>],,WF4自带了以下功能[TrackingQuery]



工作流追踪包括两个主要组件:追踪参与和追踪配置。追踪配置定义了您希望运行时需要追踪的事件和数据,配置(Profiles)包括以下三种重要的查询类型:













ActivityStateQuery
用于指定活动的状态(如关闭)、提取数据的变量和参数



[States属性]:由System.Activities.Tracking.ActivityStates的[Fieldes]提供



WorkflowInstanceQuery
用于指定工作流事件



[States属性]:由System.Activities.Tracking.WorkflowInstanceStates的[Fieldes]提供



CustomTrackingQuery
用于指定对追踪数据的明确调用,常用语自定义的活动中

跟踪参与者TrackingParticipant

跟踪参与者 [TrackingParticipant]

DLL:System.Activities.dll

类名:System.Activities.Tracking.TrackingProfile

abstract



要自定义[跟踪参与者]要从该类继承







自定义跟踪参与者

例子下载:
http://files.cnblogs.com/foundation/CustomTrackingSample.rar

自定义跟踪参与者

public
class myTrackingParticipant : System.Activities.Tracking.TrackingParticipant

{

private
const String participantName =
"wxwinter_myTrackingParticipant";



public myTrackingParticipant()

{

Console.WriteLine(
"{0} Created", participantName);

}





protected
override void Track(System.Activities.Tracking.TrackingRecord record,
TimeSpan timeout)

{

Console.Write(
"{0} emitted trackRecord: {1} Level: {2}, RecordNumber: {3}", participantName, record.GetType().FullName, record.Level, record.RecordNumber);



System.Activities.Tracking.WorkflowInstanceRecord workflowInstanceRecord = record
as System.Activities.Tracking.WorkflowInstanceRecord;

if (workflowInstanceRecord !=
null)

{

Console.WriteLine(
" Workflow InstanceID: {0} Workflow instance state: {1}", record.InstanceId, workflowInstanceRecord.State);

}



System.Activities.Tracking.ActivityStateRecord activityStateRecord = record
as System.Activities.Tracking.ActivityStateRecord;

if (activityStateRecord !=
null)

{

IDictionary<String,
object> variables = activityStateRecord.Variables;



StringBuilder vars =
new StringBuilder();



if (variables.Count >
0)

{

vars.AppendLine("\n\tVariables:");

foreach (KeyValuePair<string,
object> variable in variables)

{

vars.AppendLine(String.Format(
"\t\tName: {0} Value: {1}", variable.Key, variable.Value));

}

}

Console.WriteLine(
" :Activity DisplayName: {0} :ActivityInstanceState: {1} {2}", activityStateRecord.Activity.Name, activityStateRecord.State, ((variables.Count >
0) ? vars.ToString() :
String.Empty));

}



System.Activities.Tracking.CustomTrackingRecord customTrackingRecord = record
as System.Activities.Tracking.CustomTrackingRecord;

if ((customTrackingRecord !=
null) && (customTrackingRecord.Data.Count >
0))

{

Console.WriteLine("\n\tUser Data:");

foreach (string data
in customTrackingRecord.Data.Keys)

{

Console.WriteLine(" \t\t {0} : {1}", data, customTrackingRecord.Data[data]);

}

}

Console.WriteLine();



}

}

定义Profile

public
class myTrackingTools

{

public
static System.Activities.Tracking.TrackingParticipant getTracking()

{

//(1) TrackingProfile

System.Activities.Tracking.TrackingProfile trackingProfile =
new System.Activities.Tracking.TrackingProfile();

trackingProfile.Name =
"wxwinterTrackingProfile";



//(1.1)

System.Activities.Tracking.CustomTrackingQuery customQuery =
new System.Activities.Tracking.CustomTrackingQuery();

customQuery.Name =
"*";

customQuery.ActivityName =
"*";



//(1.2)

System.Activities.Tracking.WorkflowInstanceQuery instanceQuery =
new System.Activities.Tracking.WorkflowInstanceQuery();

instanceQuery.States.Add(System.Activities.Tracking.WorkflowInstanceStates.Aborted);

instanceQuery.States.Add(System.Activities.Tracking.WorkflowInstanceStates.Canceled);

instanceQuery.States.Add(System.Activities.Tracking.WorkflowInstanceStates.Completed);

instanceQuery.States.Add(System.Activities.Tracking.WorkflowInstanceStates.Idle);

instanceQuery.States.Add(System.Activities.Tracking.WorkflowInstanceStates.Persisted);

instanceQuery.States.Add(System.Activities.Tracking.WorkflowInstanceStates.Resumed);

instanceQuery.States.Add(System.Activities.Tracking.WorkflowInstanceStates.Started);

instanceQuery.States.Add(System.Activities.Tracking.WorkflowInstanceStates.Suspended);

instanceQuery.States.Add(System.Activities.Tracking.WorkflowInstanceStates.Terminated);

instanceQuery.States.Add(System.Activities.Tracking.WorkflowInstanceStates.UnhandledException);

instanceQuery.States.Add(System.Activities.Tracking.WorkflowInstanceStates.Unloaded);

instanceQuery.States.Add(System.Activities.Tracking.WorkflowInstanceStates.Unsuspended);



//(1.3)

System.Activities.Tracking.ActivityStateQuery activityQuery =
new System.Activities.Tracking.ActivityStateQuery();

activityQuery.ActivityName =
"*";

activityQuery.States.Add("*"); // System.Activities.Tracking.ActivityStates.Executing // System.Activities.Tracking.ActivityStates.Canceled



activityQuery.Variables.Add("*");

activityQuery. Arguments.Add("*");



//(1.4)

trackingProfile.Queries.Add(customQuery);

trackingProfile.Queries.Add(instanceQuery);

trackingProfile.Queries.Add(activityQuery);





//(2)

myTrackingParticipant myTracking =
new myTrackingParticipant();

myTracking.TrackingProfile = trackingProfile;



return myTracking;

}

}

具有CustomTrackingRecord功能的Activity

public
sealed class
myActivity : CodeActivity

{

protected
override void Execute(CodeActivityContext context)

{

Console.WriteLine("myActivity Execute");



System.Activities.Tracking.CustomTrackingRecord myRecord =
new System.Activities.Tracking.CustomTrackingRecord("myActivity_CustomTrackingRecord");



myRecord.Data.Add("wxd",
12345);



myRecord.Data.Add("wxwinter",
"lzm");



context.Track(myRecord);



}

}

使用

工作流


宿主
class
Program

{

static
void Main(string[] args)

{

System.Console.WindowWidth =
150;



//-----------------------------------------------------------------------------------

//WorkflowApplication

WorkflowApplication instance =
new WorkflowApplication(new
testWorkflow());



instance.Extensions.Add(myTrackingTools.getTracking());



instance.Run();



//------------------------------------- or ------------------------------------------

//WorkflowInvoke

// WorkflowInvoker invoker = new WorkflowInvoker(new testWorkflow());



// invoker.Extensions.Add(myTrackingTools.getTracking());



// invoker.Invoke();

//---------------------------------------------------------------------------------



System.Console.Read();

}



}

结果


EtwTrackingParticipant

[EtwTrackingParticipant]:(ETW:Enterprise Trace for Windows)

DLL:System.Activities.dll

类名:ystem.Activities.Tracking.EtwTrackingParticipant



ETW是Windows里本地组件的一个追踪系统,由操作系统中的包括驱动程序、其它核心级代码等很多组件和服务调用。写入到ETW的数据可以通过定制代码或者诸如即将推出的Windows服务AppFabric等工具来使用。AppFabric将同ETW一起搜集ETW数据并将它存储到SQL数据库。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: