一. WF提供了TrackingService抽象基类,用于为WF应用程序提供跟踪服务。跟踪服务可用一致、可靠而灵活的方式跟踪工作流相关的信息。跟踪框架的宗旨使宿主通过工作流执行期间引发的事件,而在执行期间可用观测到工作流实例。
工作流服务可用引发以下事件:
| 实例的各类状态 | Aborted、 Changed、 Completed、 Created、 Exception、 Idle、 Loaded、 Persisted、 Resumed、 Started、 Suspended、 Terminated、 Unloaded |
| Activity的各类状态 | 一个工作流是由多个Activity组成的,每一个Activity都会有一个生命周期,在此期间,Activity会经历多种状态: Canceling、 Closed、 Compensating、 Executing、 Faulting、 Initialized |
| 用户跟踪行为 | 可以在Activity代码中用TrackData方法向Tacking服务提交自定义状态点 |
代码实例:
/// <summary> /// 获取并显示工作流实例级别的事件 /// </summary> /// <param name="instanceId"></param> static void GetInstanceTrackingEvents(Guid instanceId) { SqlTrackingQuery sqlTrackingQuery = new SqlTrackingQuery(connectionString); //使用SqlTrackingQuery对象查询跟踪数据 SqlTrackingWorkflowInstance sqlTrackingWorkflowInstance; //获取工作流实例跟踪数据。 sqlTrackingQuery.TryGetWorkflow(instanceId, out sqlTrackingWorkflowInstance); if (sqlTrackingWorkflowInstance != null) { Console.WriteLine("/n实例级别的事件:/n"); //遍历并显示工作流实例跟踪数据 foreach (WorkflowTrackingRecord workflowTrackingRecord in sqlTrackingWorkflowInstance.WorkflowEvents) { Console.WriteLine("事件描述 : {0} 日期 : {1}", workflowTrackingRecord.TrackingWorkflowEvent, workflowTrackingRecord.EventDateTime); } } }
/// <summary> /// 获取并显示活动跟踪事件 /// </summary> /// <param name="instanceId"></param> static void GetActivityTrackingEvents(Guid instanceId) { SqlTrackingQuery sqlTrackingQuery = new SqlTrackingQuery(connectionString); //查询工作流实例根踪数据 SqlTrackingWorkflowInstance sqlTrackingWorkflowInstance; sqlTrackingQuery.TryGetWorkflow(instanceId, out sqlTrackingWorkflowInstance); if (sqlTrackingWorkflowInstance != null) { Console.WriteLine("/n活动跟踪事件:/n"); //遍历并显示工作流中活动跟踪记录 foreach (ActivityTrackingRecord activityTrackingRecord in sqlTrackingWorkflowInstance.ActivityEvents) { Console.WriteLine("状态描述 : {0} 日期 : {1} 活动资格ID : {2}", activityTrackingRecord.ExecutionStatus, activityTrackingRecord.EventDateTime, activityTrackingRecord.QualifiedName); } } }
二、表结构

WorkflowInstance 工作流实例
| WorkflowInstanceInternalId | 工作流实例数据库内部号 ,数据库流水号 |
| WorkflowInstanceId | 工作流实例GUID号 |
| ContextGuid | 上下文GUID号 |
| CallerInstanceId | |
| CallPath | |
| CallerContextGuid | |
| CallerParentContextGuid | |
| WorkflowTypeId | 工作流类型数据库内部号, Workflow.WorkflowTypeId |
| InitializedDateTime | 初始化时间 |
| DbInitializedDateTime | |
| EndDateTime | 结束时间 |
| DbEndDateTime |
WorkflowInstanceEvent 工作流实例结果
| WorkflowInstanceEventId | 数据库流水号 |
| WorkflowInstanceInternalId | 工作流实例数据库内部号:WorkflowInstance.WorkflowInstanceInternalId |
| TrackingWorkflowEventId | |
| EventDateTime | 结果时间 |
| EventOrder | |
| EventArgTypeId | |
| EventArg | |
| DbEventDateTime |
Workflow 工作流模板的类型编号与描绘
| WorkflowTypeId | 工作流类型数据库内部号,数据库流水号 |
| WorkflowDefinition | XML字串,类型结构的描述 |
UserEvent 用户跟踪信息
在Activity里使用this.TrackData方法添加用户跟踪结果时,数据存储在该表
| UserEventId | 用户跟踪结果ID,数据库流水号 |
| WorkflowInstanceInternalId | 该结果所属的工作流实例的数据ID, WorkflowInstance.WorkflowInstanceInternalId |
| EventOrder | |
| ActivityInstanceId | 该用户跟踪所属的Activity实例ID ActivityInstance.ActivityInstanceId |
| EventDateTime | |
| UserDataKey | 用户跟踪结果键,用this.TrackData(KEY,DATA)的KEY值 |
| UserDataTypeId | |
| UserData_Str | 用户跟踪结果值, 用this.TrackData(KEY,DATA)或this.TrackData(DATA)的DATA值 |
| UserData_Blob | |
| UserDataNonSerializable | |
| DbEventDateTime |
Type
所有在工作流中引用的Activity的信息,包括系统自带的与用户自定义的
| TypeId | Activity类型数据库内部号,数据库流水号 |
| TypeFullName | Activity名,格式是命名空间,如System.Workflow.Activities.CodeActivity 或wxd.lzmActivity |
| AssemblyFullName | 格式为版本号,公钥 |
| IsInstanceType |
TrackingWorkflowEvent 可跟踪的结果类型码表
| TrackingWorkflowEventId | 结果编号数据库内部号 |
| Description | 描述文字,Created,Completed,Idle,Suspended,Resumed,Persisted,Unloaded, Loaded,Exception,Terminated,Aborted,Changed,Started |
TrackingProfileInstance
| InstanceId | |
| TrackingProfileXml | |
| UpdatedDateTime |
TrackingProfile
自定义TrackingProfile的数据,自定义跟踪筛选器
| TrackingProfileId | TrackingProfile的编号,数据库流水号 |
| Version | 版本, |
| WorkflowTypeId | 该筛选器所属的工作流的模板 |
| TrackingProfileXml | 筛选器的XML结构 |
| InsertDateTime | 插入时间 |
TrackingPartitionSetName
| PartitionId | |
| Name | |
| CreatedDateTime | |
| EndDateTime | |
| PartitionInterval |
TrackingPartitionInterval
| Interval |
TrackingDataItemAnnotation
| TrackingDataItemId | |
| WorkflowInstanceInternalId | |
| Annotation |
TrackingDataItem
| TrackingDataItemId | |
| WorkflowInstanceInternalId | |
| EventId | |
| EventTypeId | |
| FieldName | |
| FieldTypeId | |
| Data_Str | |
| Data_Blob | |
| DataNonSerializable |
RemovedActivity
| WorkflowInstanceInternalId | |
| WorkflowInstanceEventId | |
| QualifiedName | |
| ParentQualifiedName | |
| RemovedActivityAction | |
| Order |
EventAnnotation
| WorkflowInstanceInternalId | |
| EventId | |
| EventTypeId | |
| Annotation |
DefaultTrackingProfile
默认的TrackPoints的XML字串配置文件
| Version | 版本号 |
| TrackingProfileXml | XML字串的TrackPoints配置文件 |
| InsertDateTime |
AddedActivity
| WorkflowInstanceInternalId | |
| WorkflowInstanceEventId | |
| QualifiedName | |
| ActivityTypeId | |
| ParentQualifiedName | |
| AddedActivityAction | |
| Order |
ActivityInstance
每个实例的每个Activity的信息
| WorkflowInstanceInternalId | 所属的工作流实例:WorkflowInstance.WorkflowInstanceInternalId |
| ActivityInstanceId | Activity状态流水号,数据库内部号 |
| QualifiedName | Activity,调计时Activity的名子 |
| ContextGuid | GUID |
| ParentContextGuid | GUID |
| WorkflowInstanceEventId |
ActivityExecutionStatusEvent
每个实例的每个Activity的执行状态结果
| ActivityExecutionStatusEventId | Activity实例流水号,数据库内部号 |
| WorkflowInstanceInternalId | 所属的工作流实例: WorkflowInstance.WorkflowInstanceInternalId |
| EventOrder | |
| ActivityInstanceId | 执行状态,ActivityExecutionStatus.ExecutionStatusId |
| ExecutionStatusId | |
| EventDateTime | |
| DbEventDateTime |
ActivityExecutionStatus
Activity执行状态码表
| ExecutionStatusId | 状态流水号,数据库内部号 |
| Description | 描述文字,Initialized,Executing,Canceling,Closed,Compensating,Faulting |
Activity
每个工作流模板中的Activity与工作流模板,及Activity类型的关系
| WorkflowTypeId | 所属工作流模板,Workflow.WorkflowTypeId |
| QualifiedName | Activity的代码名 |
| ActivityTypeId | 该Activity的类型, Type.TypeId |
| ParentQualifiedName | 该Activity的父容器名,为空表示为工作流主容器 |
存储过程
GetTrackingProfile 得到自定义筛选器的版本
得到Profile版本,(得到自定义筛选器的版本)
| @TypeFullName | 值为要查询的工作流类的类名: typeof(wxdlzm1).ToString() 或typeof(wxdlzm1).FullName |
| @AssemblyFullName | 值为要查询工作流类的全称名: typeof(wxdlzm1).Assembly.FullName |
| @Version | |
| @CreateDefault |
UpdateTrackingProfile 插入自定义筛选器到TrackingProfile表
插入Profile到TrackingProfile表,(插入自定义筛选器到TrackingProfile表)
| @TypeFullName | 值为要设置工作流类的类名: typeof(wxdlzm1).ToString() |
| @AssemblyFullName | 值为要设置工作流类的全称名: typeof(wxdlzm1).Assembly.FullName |
| @Version | 值为要指定的片本号的字串:格式"3.0.0.7" |
| @TrackingProfileXml | 值为TrackingProfile格式的XML字串 |
三. TrackingProfile跟踪服务筛选器
1.Tacking服务所要记录的状态是可以通过自定义Tacking Pofile进行筛选的.
2.默认Tacking服务对 [实例的各类状态]、[Activity的各类状态]、[用户跟踪行为]的所有状态进行记录,
3.可以自定义自定义Tacking Pofile让Tacking服务只记录实际需要的状态.
4.以下各类状态变化可被Tacking服务记录,也可用Tacking Pofile进行筛选:
| 实例的各类状态 | Aborted、 Changed、 Completed、 Created、 Exception、 Idle、 Loaded、 Persisted、 Resumed、 Started、 Suspended、 Terminated、 Unloaded |
| Activity的各类状态 | 一个工作流是由多个Activity组成的, 每一个Activity都会有一个生命周期,在此期间,Activity会经历多种状态: Canceling、 Closed、 Compensating、 Executing、 Faulting、 Initialized |
| 用户跟踪行为 | 可以在Activity代码中用TrackData方法向Tacking服务提交自定义状态点 |
5.自定义Tacking Pofile将生成一个XML串,存入TrackingProfile表的TrackingProfileXml字段中
6.默认的Tacking Pofile以一个XML串的形式存于DefaultTrackingProfile表的TrackingProfileXml字段中
7.自定义Tacking Pofile只对指定的工作流有效,默认的Tacking Pofile对所有没有自定义Tacking Pofile的工作流有效。
8.如果所有工作流要使用同样的筛选,可以直接修改默认的Tacking Pofile,
9.如果同一对象已添加自定义的Tacking Pofile,使用默认方式再添加时,将出产生异常,该异常由UpdateTrackingProfile存储过程产生.
10.完全可以手工操作Pofile的XML串,也可以手工操作Tacking数据
一个TrackingProfile跟踪服务筛选类
四。 TrackingService,TrackingChannel自定义跟踪服务


WF提供一个tracking基本结构,可以用他去跟踪实例改变的数据与状态,
需要实现TrackingChannel 与TrackingServic这两个类,
TrackingChannel接收引擎发送的各种tracking记录,
TrackingServic为引擎提供了接口
引擎调用tracking服务是同步的,工作流实例执行一个阻塞直到从tracking服务有方法返回
WF的工作流引擎是个黑箱子,所有有关工作流实例运行的情况或事件只有WF引擎知道,Hosting如果想知道,那么需要一个查询的界面。Tracking就是这个查询界面
public class Tracking通道 : TrackingChannel { private TrackingParameters 被跟踪的实例 = null; public Tracking通道(TrackingParameters parameters) { this.被跟踪的实例 = parameters; } //Tracking runtime调用该方将实例完成的信息向外界抛 protected override void InstanceCompletedOrTerminated() { Console.WriteLine("实例:" + 被跟踪的实例.InstanceId.ToString()); } //Tracking runtime调用该方法发送将监视到的各类tracking records向外界抛出 protected override void Send(TrackingRecord record) { //筛选实例 if (record is WorkflowTrackingRecord) { WorkflowTrackingRecord obj1 = (WorkflowTrackingRecord)record; Console.WriteLine("时间: " + obj1.EventDateTime.ToString()); } //筛选结点 if (record is ActivityTrackingRecord) { ActivityTrackingRecord obj2 = (ActivityTrackingRecord)record; Console.WriteLine("时间: " + obj2.EventDateTime.ToString()); } //筛选业务状态点(用户状态点) if (record is UserTrackingRecord) { UserTrackingRecord obj3= (UserTrackingRecord)record; Console.WriteLine("实例:" + 被跟踪的实例.InstanceId.ToString()); Console.WriteLine("时间: " + obj3.EventDateTime.ToString()); //筛选业务状态点(用户状态点)中的规则 if (obj3.UserData is System.Workflow.Activities.Rules.RuleActionTrackingEvent) { RuleActionTrackingEvent obj3_rule = (RuleActionTrackingEvent)obj3.UserData; Console.WriteLine("规则名: " + obj3_rule.RuleName.ToString()); //Policy绑定的规则集中的每个规则都会发送一组状态,Policy有点像职责链,具体以后讲 //Policy规则是自动将信息抛出的,但在类型上算上用户状态 } } } }
TrackingService实现
public class 自定义跟踪服务 : TrackingService { protected override bool TryGetProfile(Type workflowType, out TrackingProfile profile) { //引擎通过该方法加载监视方案 //可在该方法内为工作流模板与对应的筛选建一字典集合, //该演示设计成所有工作流都使用同一筛选规则方式 //参数:workflowType,传入的类型,用于在字典集合中查找对应的筛选规则 //参数:out profile,传地址抛出筛选规则 profile = 生成一个Profile(); return true; //表示找到所指定的类型对应的筛选规则 } protected override TrackingProfile GetProfile(Guid workflowInstanceId) { //跟据实例查对应的规则 //可用字典集实现 return 生成一个Profile(); } protected override TrackingProfile GetProfile(Type workflowType, Version profileVersionId) { //返回指定工作流模板的指定版本号的筛选规则 //参数:profileVersionId,版本号 //可用字典集实现 return 生成一个Profile(); } protected override bool TryReloadProfile(Type workflowType, Guid workflowInstanceId, out TrackingProfile profile) { //重载指定工作流模板的筛选规则 //参数:workflowType., //参数:workflowInstanceId, //参数:out profile, profile = null; return false; } protected override TrackingChannel GetTrackingChannel(TrackingParameters parameters) { //用TrackingParameters参数初始化信道 return new Tracking通道(parameters); } // 建立自定义的TrackingProfile 关于自定义TrackingProfile 见相关 private static TrackingProfile 生成一个Profile() {//一个全监视的profile TrackingProfile profile = new TrackingProfile(); profile.Version = new Version("4.3.2.1"); ActivityTrackPoint 结点跟踪点对象= new ActivityTrackPoint(); ActivityTrackingLocation location = new ActivityTrackingLocation(typeof(Activity)); location.MatchDerivedTypes = true; foreach (ActivityExecutionStatus s in Enum.GetValues(typeof(ActivityExecutionStatus))) { location.ExecutionStatusEvents.Add(s); } 结点跟踪点对象.MatchingLocations.Add(location); profile.ActivityTrackPoints.Add(结点跟踪点对象); UserTrackPoint 用户跟踪点对象= new UserTrackPoint(); UserTrackingLocation UserTrackingLocation标记= new UserTrackingLocation(); UserTrackingLocation标记.ActivityType = typeof(Activity); UserTrackingLocation标记.ArgumentType = typeof(object); UserTrackingLocation标记.MatchDerivedArgumentTypes = true; UserTrackingLocation标记.MatchDerivedActivityTypes = true; 用户跟踪点对象.MatchingLocations.Add(UserTrackingLocation标记); profile.UserTrackPoints.Add(用户跟踪点对象); WorkflowTrackPoint 实例跟踪点对象= new WorkflowTrackPoint(); 实例跟踪点对象.MatchingLocation = new WorkflowTrackingLocation(); foreach (TrackingWorkflowEvent workflowEvent in Enum.GetValues(typeof(TrackingWorkflowEvent))) { 实例跟踪点对象.MatchingLocation.Events.Add(workflowEvent); } profile.WorkflowTrackPoints.Add(实例跟踪点对象); return profile; } }
注:本文大部分来自:http://www.cnblogs.com/foundation/category/212578.html
768

被折叠的 条评论
为什么被折叠?



