在堅持學習WF(22):跟蹤規則這篇文章我們講述瞭如何使用Trace來對規則進行跟蹤,我們也可以使用SqlTrackingService跟蹤規則,我們先來建立一個順序型工作流程序,工作流設計器中我們只添加一個PolicyActivity活動,並設計他的RuleSet,我們還是使用堅持學習WF(22):跟蹤規則這篇文章中的RuleSet,具體請看下錶:
Rule | Conditon | ThenAction | ElseAction |
RuleC | this.D < 100 | this.B = this.B - 12 |
|
RuleB | this.B > 50 | this.C = "Preferred" |
this.C = "Normal" |
RuleA | this.A > 10 | this.B = 60 |
this.B = 40 |
工作流代碼中添加相關變量如下:
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); }
執行工作流結果如下:
上面的結果中包含RuleSet中各個規則的計算情況,下一篇文章中我們使用自定義跟蹤配置文件來跟蹤Rule中具體的變量的變化情況。
本文轉自生魚片博客園博客,原文鏈接:http://www.cnblogs.com/carysun/archive/2008/11/22/RuleSqlTracking.html,如需轉載請自行聯繫原作者