posts - 232, comments - 1625, trackbacks - 55, articles - 12
  博客园 :: 首页 ::  :: 联系 :: 订阅 订阅 :: 管理

坚持学习WF(22):跟踪规则这篇文章我们讲述了如何使用Trace来对规则进行跟踪,我们也可以使用SqlTrackingService跟踪规则,我们先来建立一个顺序型工作流程序,工作流设计器中我们只添加一个PolicyActivity活动,并设计他的RuleSet,我们还是使用坚持学习WF(22):跟踪规则这篇文章中的RuleSet,具体请看下表:

Rule Conditon ThenAction ElseAction
RuleC this.D < 100

this.B = this.B - 12
System.Console.WriteLine("RuleC:Then" + this.B)

 
RuleB this.B > 50

this.C = "Preferred"
System.Console.WriteLine("RuleB:Then" + this.C)

this.C = "Normal"
System.Console.WriteLine("RuleB:Else" + this.C)

RuleA this.A > 10

this.B = 60
System.Console.WriteLine("RuleA:Then" + this.B)

this.B = 40
System.Console.WriteLine("RuleA:Else" + this.B)

 

工作流代码中添加相关变量如下:
private intA = 12;
private intD = 99;
private intB = 0;
private stringC = "";


宿主程序中我们加载SqlTrackingService服务,代码如下:

namespace CarySqlRuleTracking
{
    class Program
    {
        private static String strConn = String.Format("Initial Catalog={0};Data Source={1};
Integrated Security={2};"
, "WorkflowTracking", @"localhost\SQLEXPRESS", "SSPI"); static void Main(string[] args) { using(WorkflowRuntime workflowRuntime = new WorkflowRuntime()) { SqlTrackingService sts = new SqlTrackingService(strConn); AutoResetEvent waitHandle = new AutoResetEvent(false); workflowRuntime.WorkflowCompleted += delegate(object sender,
WorkflowCompletedEventArgs e) {waitHandle.Set();}; workflowRuntime.WorkflowTerminated += delegate(object sender,
WorkflowTerminatedEventArgs e) { Console.WriteLine(e.Exception.Message); waitHandle.Set(); }; workflowRuntime.AddService(sts); WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(
CarySqlRuleTracking.CarySqlRuleTrackingWorkflow)); Console.WriteLine("---工作流执行开始---"); instance.Start(); waitHandle.WaitOne(); Console.WriteLine("---工作流执行结束---"); TrackingConsoleWriter trackingWriter = new TrackingConsoleWriter(strConn); trackingWriter.DisplayTrackingData(instance.InstanceId);
} } } }


这样跟踪数据就写入到跟踪数据库中了,我们还是使用WF中的跟踪服务(2):使用SqlTrackingService这篇文章中的
TrackingConsoleWriter类来将跟踪信息显示出来,代码如下:
TrackingConsoleWriter trackingWriter= new TrackingConsoleWriter(strConn);
trackingWriter.DisplayTrackingData(instance.InstanceId);


我们使用SqlTrackingQuery查询的时候。SqlTrackingWorkflowInstance有一个UserEvents属性,该属性包括UserTrackingRecord集合,每一个UserTrackingRecord都有一个UserData属性。如果这个UserTrackingRecord包含Rule数据的话,该UserData属性是一个RuleActionTrackingEvent对象的实例,该对象里包含RuleName和ConditionResult属性。当规则执行时,将发送 RuleActionTrackingEvent 对象作为用户跟踪点。在我们自己开发的TrackingConsoleWriter类中,下面的代码是处理这个的:
UserTrackingRecorduserRecord = record asUserTrackingRecord;
                  
if(userRecord.UserData isRuleActionTrackingEvent)
{
        WriteRuleData(userRecord);
}

private static void WriteRuleData(UserTrackingRecord userRecord)
{
    RuleActionTrackingEvent ruleAction = userRecord.UserData as RuleActionTrackingEvent;
    Console.WriteLine("{0:HH:mm:ss.fff} RuleAction from {1} Rule:{2} Result:{3}",
            userRecord.EventDateTime,userRecord.QualifiedName,
            ruleAction.RuleName,ruleAction.ConditionResult);
}
 

执行工作流结果如下:

clip_image002

上面的结果中包含RuleSet中各个规则的计算情况,下一篇文章中我们使用自定义跟踪配置文件来跟踪Rule中具体的变量的变化情况。

作者:生鱼片
         
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

Feedback

#1楼  回复 引用 查看   

2010-05-13 17:17 by sharezone      
楼主,请教个问题,我如果用sqlTrackingService的时候能不能追踪到正在运行的工作流实例呢?谢谢。

#2楼[楼主]  回复 引用 查看   

2010-05-13 17:27 by 生鱼片      
@sharezone
可以啊,跟踪信息中有Executing状态的就是正在运行的实例。

#3楼  回复 引用 查看   

2010-05-13 22:34 by sharezone      
多谢楼主这么及时, 我在调试过程中一个工作流一条if分支是等待3分钟的活动,但是在运行过程中不能获取监控信息,执行完了才会有,我用的sdk里的例子.

#4楼  回复 引用 查看   

2010-05-13 22:37 by sharezone      
还有一个问题,我发现监控的时候工作流dll文件如果不做版本控制(我是添加程序签名,而且每次修改要将版本号改变,同时要将dll发布到全局缓存中)的话,一旦更改过工作流,重新加载dll,在运行监控程序时,有的活动找不到,就出现错误了.

#5楼[楼主]  回复 引用 查看   

2010-05-14 10:25 by 生鱼片      
@sharezone
你的跟踪信息保存在哪里,是WF本身的跟踪服务吗?如果是的话,在你的跟踪配置文件中如果设置了对正在运行的工作流实例进行跟踪,在跟踪数据库中应该可以找到相关信息的。

#6楼  回复 引用 查看   

2010-05-14 13:41 by sharezone      
谢谢楼主.我用的是wf本身的跟踪服务 SqlTrakingService 加载到runtime里了,不知道跟踪配置文件怎么设置, 我是用微软的例子跟踪的.请查看下邮件.