WF4.0 基础篇 (二十二) Tracking
来源:互联网 发布:千牛店铺数据 编辑:程序博客网 时间:2024/05/21 22:33
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
自定义跟踪参与者
publicclass myTrackingParticipant : System.Activities.Tracking.TrackingParticipant
{
privateconst String participantName ="wxwinter_myTrackingParticipant";
public myTrackingParticipant()
{
Console.WriteLine("{0} Created", participantName);
}
protectedoverride 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 = recordas 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 = recordas 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 = recordas System.Activities.Tracking.CustomTrackingRecord;
if ((customTrackingRecord !=null) && (customTrackingRecord.Data.Count > 0))
{
Console.WriteLine("\n\tUser Data:");
foreach (string datain customTrackingRecord.Data.Keys)
{
Console.WriteLine(" \t\t {0} : {1}", data, customTrackingRecord.Data[data]);
}
}
Console.WriteLine();
}
}
定义Profile
publicclass myTrackingTools
{
publicstatic 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
publicsealed class myActivity : CodeActivity
{
protectedoverride 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);
}
}
使用
工作流
宿主
classProgram
{
staticvoid Main(string[] args)
{
System.Console.WindowWidth =150;
//-----------------------------------------------------------------------------------
//WorkflowApplication
WorkflowApplication instance =new WorkflowApplication(newtestWorkflow());
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数据库。
- WF4.0 基础篇 (二十二) Tracking
- WF4.0 基础篇 (二十一) WorkflowInvoker
- WF4.0 基础篇 (二十九) WorkflowInspectionServices
- WF4.0 基础篇 (十二) CancellationScope 取消容器
- WF4.0 基础篇 (二十三) 范型Activity
- WF4.0 基础篇 (二十四) Async Activity
- WF4.0 基础篇 (二十五) ActivityAction 与 InvokeAction
- WF4.0 基础篇 (二十五)(补充) ActivityFunc 与 InvokeFunc
- WF4.0 基础篇 (二十八) WF调用PowerShell
- WF4.0 基础篇 (十四) Delay 与WF4中的线程
- WF4.0 基础篇 (十六) CompensableActivity 补偿
- WF4.0 基础篇 (十七) Bookmark
- WF4.0 基础篇 (十八) Flowchart
- WF4.0 基础篇 (二) Activity介绍及WriteLine Activity的使用
- WF4.0 基础篇 (二) Activity介绍及WriteLine Activity的使用
- WF4.0 基础篇 (二十) ActivityWithResult 有返回值Activity
- WF4.0 基础篇 (二十六) Interop调用WF3.X的Activity
- WF4.0 基础篇 (二十七) WCF Workflow Service 在WCF中使用WF
- WF4.0 基础篇 (二十一) WorkflowInvoker
- Unity3DScript 脚本所有编译器属性详解
- php编程日记
- 关于 C:\Windows\System32\drivers\etc\下面的 hosts文件
- java综合小知识 容易出错
- WF4.0 基础篇 (二十二) Tracking
- tarjan找桥,找割点,无向图的最小割权边--hdu4738(2013杭州网络赛)
- 国际著名科技大奖一览
- picture
- Xcode中git的使用
- WF4.0 基础篇 (二十三) 范型Activity
- snprintf和sprintf
- 3D游戏引擎技术剖析
- init eclipse java