WF跟踪是用来记录工作流执行情况
WF跟踪由以下几部分组成:
跟踪记录 Tracking Records |
从工作流运行时发出 |
跟踪配置 Tracking Profile |
用来筛选从工作流实例中发出的跟踪记录 |
跟踪参与者 Tracking Participants |
用来订阅跟踪记录。跟踪参与者包括处理来自跟踪记录的负载的逻辑 |
ActivityInfo |
System.Activities.Tracking.ActivityInfo |
TrackingProvider |
System.Activities.Tracking.TrackingProvider |
跟踪记录[TrackingRecord]
DLL:System.Activities.dll
类名:System.Activities.Tracking.TrackingRecord
TrackingRecord为[Abstract],WF4自带了以下功能[TrackingRecord]
CustomTrackingRecord |
可在Activity中使用[context.Track(CustomTrackingRecord)]方式添加自定义跟踪记录 |
跟踪配置[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]
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();
} } |
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; } } |
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]:(ETW:Enterprise Trace for Windows)
DLL:System.Activities.dll
类名:ystem.Activities.Tracking.EtwTrackingParticipant
ETW是Windows里本地组件的一个追踪系统,由操作系统中的包括驱动程序、其它核心级代码等很多组件和服务调用。写入到ETW的数据可以通过定制代码或者诸如即将推出的Windows服务AppFabric等工具来使用。AppFabric将同ETW一起搜集ETW数据并将它存储到SQL数据库。