VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 编程开发 > Objective-C编程 >
  • c#教程之WF框架编程监控部分

制作者:剑锋冷月 单位:无忧统计网,www.51stat.net
 

  1 结构分析

  参考:MSDN http://msdn2.microsoft.com/zh-cn/magazine/cc163466.aspx

  WF的监控参考下图:WF容许有多个跟踪服务(即可以在WrokflowRuntime中Add多个TrckingService的子类),允许将多个跟踪服务添加到运行库中以支持不同的业务要求,各跟踪服务负责特定的实现,但是只有一个跟踪侦听器:跟踪侦听器接收所有事件的通知,多数情况下,只有这些事件中的一个子集是有用的,如果要使用多个跟踪服务,各任务有可能将只关注于唯一一个信息子集,跟踪侦听器将查询各配置的跟踪服务以跟踪各类工作流的配置文件

wf框架编程(监控部分)  : 监控

  图片来源:MSDN

  配置文件其实就是TrackingProfile,实质上是一组跟踪点,关于何时提取数据以及提取哪些数据的信息。我们可以图形化配置TrackingProfile,可以加快开发和部署跟踪配置文件的速度

  如果有图形化配置修改Trackingprofile的需求:可以参考http://netfx3.com/content/WFHome.aspx 里面的TrackingProfileDesigner这个例子。

  2 设计思路分析2.1 静态结构

  在工作流引擎中每个工作流实例都是做为一个线程运行的,出于线程安全性考虑

  工作流引擎只和TrackingService存在依赖关系,TrackingService的职责是获得TrackingProfile和TrackingChannel,TrackingPfofile定义什么状态将会被监控,默认的Tacking Pofile对 [实例的各类状态]、[Activity的各类状态]、[用户跟踪行为]的所有状态进行记录。而TrackingChannel定义如何将捕获的信息保存。这里要注意的是:TrackingProfile不是抽象类,它只是做为容器,没有方法。

 

  2.2 TrackingProfile结构分析:

  上面提到默认的Tacking Pofile对 [实例的各类状态]、[Activity的各类状态]、[用户跟踪行为]的所有状态进行记录。默认的Tacking Pofile对所有没有自定义Tacking Pofile的工作流有效。如果工作流只需要监控某些特定的状态变化,可用自定义Tacking Pofile进行筛选,我们可以直接修改默认的Tacking Pofile 。参考下面的类图:TrackingProfile由TrackingPointCollection构成,TrackingPoint中的MatchingLocations 和 ExcludedLocations 集合使您能够密切控制数据收集的时间,MatchingLocations 集合以指明您要跟踪这些事件,或者将此信息添加到 ExcludedLocations 集合以指明该数据不应被收集。

wf框架编程(监控部分)  : 监控

  如何加入UserData?

  要实现图形化跟踪只跟踪状态变化是不够的,对于实际运用,跟踪时候往往要跟踪一些其他信息,比如:任务是谁(角色)发起,指派给谁(角色),具体由谁处理,处理时间等等。所以要加入自定义的UserData才行。

  如果要加入用户自定义的数据可以在自定义Acitivity中调用TrackData方法实现,请参考Activity定义,也可以调用ActivityExecutionContext的方法实现。

  protected void TrackData(object userData);

  protected void TrackData(string userDataKey, object userData);

  调用TrackData会触发自定义跟踪事件

  2.3 默认情况下Tracking的使用流程

  默认使用方式(sqlserver存储Tracking信息)

  条件:SqlTrackingService加入运行时

wf框架编程(监控部分)  : 监控

 
 

  workflowRuntime.AddService(new SqlTrackingService(connectionString));

  1.SqlTrackingQuery.TryGetWorkflow得到SqlTrackingWorkflowInstance

  2.得到三种TrackingRecord的集合

  IList<WorkflowTrackingRecord> = SqlTrackingWorkflowInstance.WorkflowEvents

  IList<ActivityTrackingRecord> = SqlTrackingWorkflowInstance.ActivityEvents

  IList<UserTrackingRecord> = SqlTrackingWorkflowInstance.UserEvents

  3.WorkflowTrackingRecord可以得到实例每个状态发生变化时通知的信息

  TrackingWorkflowEvent类型值如下

  Aborted:

  Changed:

  Completed:

  Created:

  Exception:

  Idle:

  Loaded:

  Persisted:

  Resumed:

  Started:

  Suspended:

  Terminated:

  Unloaded:

  发生时间:EventDateTime

  4.ActivityTrackingRecord可以得到Activity每个状态发生变化时通知的信息

  Activity曾发生的状态,Activity类型,Activity上下文GUID,该状态发生的时间,Activity容器对象GUID,Activity名(开发时对象名)等等

  ExecutionStatus   状态说明

  ActivityExecutionStatus类型,值如下

  Canceling:

  Closed:

  Compensating:

  Executing:

  Faulting:

  Initialized:

  EventArgs

  TrackingWorkflowSuspendedEventArgs : 挂起

  TrackingWorkflowTerminatedEventArgs:终止(异常就是引起终止的原因之一)

  TrackingWorkflowExceptionEventArgs:异常

  UserTrackingRecord可以得到用户状态

 
 

  2.3 如何实现自定义监控

  TrackingService是抽象类,使用工厂模式加入Runtime中

  如果要自定义TrackingService,就要实现自定义的TrackingProfile和TrackingChannel

  TrackingProfile可以认为是容器(包含了UserTrackPoint,WorkflowTrackPoint,ActivityTrackPoint),定义了在什么时候(那种状态发生变化的时候)发送TrackingRecord

  TrackingChannel是抽象类,Send方法定义了对TrackingRecord的处理,可以持久化到数据库,也可以持久化到文件或者打印输出

  InstanceCompletedOrTerminated方法,在工作流结束时被调用。

  TrackingParameters的信息可以用来识别wf实例所关联的跟踪信道。

  可以自己实现特定的TrackingQuery从持久化介质中获得

  默认的SqlTrackingQuery实现方法...实现机制...(估计是调用存储过程取数的一个过程)

  获得自定义TrackingProfile和

  如何设置自定义Tacking Pofile

  TrackingProfile类图分析(),构造容器。

  WorkflowTrackPoint由TrackingWorkflowEvent枚举定义

  ActivityTrackPoint由ActivityExecutionStatus枚举定义

  UserTrackPoint:可以在自定义Acitivity的Execute方法中调用TrackData方法发送数据,可以指定对那种类型的Acitivity使用UserTrack

  TrackData是在Activity中定义protected方法。protected void TrackData(object userData);

  TrackingCondition的使用

  ActivityTrackingCondition的使用,例如:活动的优先级属性设置为 High 时才跟踪电子邮件

  ActivityTrackingCondition condition =

  new ActivityTrackingCondition("Priority", "High");

 

  actMatch.Conditions.Add(condition);

  属性值的形式从活动或工作流提取数据,使用ActivityDataTrackingExtract提前Activity属性

  actTrack.Extracts.Add(new ActivityDataTrackingExtract("To"));

  跟踪服务筛选器,Tacking服务,可以这样理解:MatchingLocation定义TrackLocation定义的触发器(只是针对Acitivity和Workflow状态机),UserTrackingLocation定义常规需要加入的信息

  UserTracking的触发是由Activity自己实现的。

  可用Tacking Pofile进行筛选,

  如何挂自定义Tacking Pofile

  默认的SqlTrackingService可以用ProfileUpdated事件挂自定义的TrackingProfile

  自定义的TrackingService如下TrackingProfile可以持久化成XML字符串保存到xml文件中或者保存到数据库,TrackingProfileSerializer保存成字符串。

  关于TrackData

  ActivityExecutionContext和Activity中都存在 

  图形化跟踪(HttpHandler)

  如果是web方式:我们先序列化设计器MarkupSerialer得到XOML,调用view.SaveWorkflowImage存成图片,reponse给客户端就可以实现,StartKit是个现成的例子。http://netfx3.com/content/WFHome.aspx 上也有例子和Jon Flanders的blog上的内容相同,可以参考ASP.NET Workflow Monitor Implementation这个例子

wf框架编程(监控部分)  : 监控

  如果是Winform客户端可以看http://netfx3.com/content/WFHome.aspx

  中WorkflowManager的例子:

wf框架编程(监控部分)  : 监控

 

  实例分析:StarKit

 

 

 

  2.2 TrackingProfile结构分析:

  上面提到默认的Tacking Pofile对 [实例的各类状态]、[Activity的各类状态]、[用户跟踪行为]的所有状态进行记录。默认的Tacking Pofile对所有没有自定义Tacking Pofile的工作流有效。如果工作流只需要监控某些特定的状态变化,可用自定义Tacking Pofile进行筛选,我们可以直接修改默认的Tacking Pofile 。参考下面的类图:TrackingProfile由TrackingPointCollection构成,TrackingPoint中的MatchingLocations 和 ExcludedLocations 集合使您能够密切控制数据收集的时间,MatchingLocations 集合以指明您要跟踪这些事件,或者将此信息添加到 ExcludedLocations 集合以指明该数据不应被收集。

wf框架编程(监控部分)  : 监控

  如何加入UserData?

  要实现图形化跟踪只跟踪状态变化是不够的,对于实际运用,跟踪时候往往要跟踪一些其他信息,比如:任务是谁(角色)发起,指派给谁(角色),具体由谁处理,处理时间等等。所以要加入自定义的UserData才行。

  如果要加入用户自定义的数据可以在自定义Acitivity中调用TrackData方法实现,请参考Activity定义,也可以调用ActivityExecutionContext的方法实现。

  protected void TrackData(object userData);

  protected void TrackData(string userDataKey, object userData);

  调用TrackData会触发自定义跟踪事件

  2.3 默认情况下Tracking的使用流程

  默认使用方式(sqlserver存储Tracking信息)

  条件:SqlTrackingService加入运行时

wf框架编程(监控部分)  : 监控


相关教程