程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> 關於C# >> wf框架編程-監控部分:監控

wf框架編程-監控部分:監控

編輯:關於C#

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved