1 結構分析
參考:MSDN http://msdn2.microsoft.com/zh-cn/magazine/cc163466.aspx
WF的監控參考下圖:WF容許有多個跟蹤服務(即可以在WrokflowRuntime中Add多個TrckingService的子類),允許將多個跟蹤服務添加到運行庫中以支持不同的業務要求,各跟蹤服務負責特定的實現,但是只有一個跟蹤偵聽器:跟蹤偵聽器接收所有事件的通知,多數情況下,只有這些事件中的一個子集是有用的,如果要使用多個跟蹤服務,各任務有可能將只關注於唯一一個信息子集,跟蹤偵聽器將查詢各配置的跟蹤服務以跟蹤各類工作流的配置文件
圖片來源: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 集合以指明該數據不應被收集。
如何加入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加入運行時
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這個例子
如果是Winform客戶端可以看http://netfx3.com/content/WFHome.aspx
中WorkflowManager的例子:
實例分析:StarKit