一. 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