您的位置:首页 > 数据库

WF中的跟踪服务(3):使用SqlTrackingService跟踪规则

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

RuleConditonThenActionElseAction
RuleCthis.D<100this.B=this.B-12
System.Console.WriteLine("RuleC:Then"+this.B)

RuleBthis.B>50this.C="Preferred"
System.Console.WriteLine("RuleB:Then"+this.C)

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

RuleAthis.A>10this.B=60
System.Console.WriteLine("RuleA:Then"+this.B)

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

工作流代码中添加相关变量如下:
privateintA=12;
privateintD=99;
privateintB=0;
privatestringC="";



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

namespaceCarySqlRuleTracking
{
classProgram
{
privatestaticStringstrConn=String.Format("InitialCatalog={0};DataSource={1};
IntegratedSecurity={2};","WorkflowTracking",@"localhost\SQLEXPRESS","SSPI");
staticvoidMain(string[]args)
{
using(WorkflowRuntimeworkflowRuntime=newWorkflowRuntime())
{
SqlTrackingServicests=newSqlTrackingService(strConn);
AutoResetEventwaitHandle=newAutoResetEvent(false);
workflowRuntime.WorkflowCompleted+=delegate(objectsender,
WorkflowCompletedEventArgse){waitHandle.Set();};
workflowRuntime.WorkflowTerminated+=delegate(objectsender,
WorkflowTerminatedEventArgse)
{
Console.WriteLine(e.Exception.Message);
waitHandle.Set();
};
workflowRuntime.AddService(sts);

WorkflowInstanceinstance=workflowRuntime.CreateWorkflow(typeof(
CarySqlRuleTracking.CarySqlRuleTrackingWorkflow));
Console.WriteLine("---工作流执行开始---");
instance.Start();
waitHandle.WaitOne();
Console.WriteLine("---工作流执行结束---");
TrackingConsoleWritertrackingWriter=newTrackingConsoleWriter(strConn);
trackingWriter.DisplayTrackingData(instance.InstanceId);
}
}
}
}


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

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

if(userRecord.UserDataisRuleActionTrackingEvent)
{
WriteRuleData(userRecord);
}



privatestaticvoidWriteRuleData(UserTrackingRecorduserRecord)
{
RuleActionTrackingEventruleAction=userRecord.UserDataasRuleActionTrackingEvent;
Console.WriteLine("{0:HH:mm:ss.fff}RuleActionfrom{1}Rule:{2}Result:{3}",
userRecord.EventDateTime,userRecord.QualifiedName,
ruleAction.RuleName,ruleAction.ConditionResult);
}


执行工作流结果如下:





上面的结果中包含RuleSet中各个规则的计算情况,下一篇文章中我们使用自定义跟踪配置文件来跟踪Rule中具体的变量的变化情况。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐