概述
工作流是對業務流程的建模,當我們設計工作流的時候,我們首先要分析業務處理過程中要經歷的步驟。然后,我們就可以利用WF創建工作流模型來模擬業務的處理過程。
我們知道,WF包含兩種類型的工作流:順序工作流和狀態機工作流。順序工作流提供了一系列有組織的步驟,一般情況下,步驟是逐一執行的。可能有的步驟需要等待某些事件的發生才可以繼續執行,但通常情況下順序工作流一般用於無需人工干預的操作。
狀態機工作流提供了一系列的狀態。工作流從初始狀態開始,到終止狀態結束。兩個狀態之間定義行為進行過渡。通常情況下,狀態機工作流對事件作出反應,事件的發生將會使狀態發生改變。
在線診斷的業務流程圖
現在來看WF 狀態設計圖
new workflow的序例圖如下
WF workflow 傳值方式
public sealed partial class CTDiagnosis : StateMachineWorkflowActivity { private WorkFlowActivityEntity internalMyActivityData; public WorkFlowActivityEntity MyActivityDataProperty { get { return internalMyActivityData; } set { internalMyActivityData = value; } } public CTDiagnosis() { InitializeComponent(); } private void handleManagerSendBackEvent_Invoked(object sender, ExternalDataEventArgs e) { LocalEventArgs localEventArgs = (LocalEventArgs)e; internalMyActivityData.GotoCondition = localEventArgs.WorkFlowActivityEntityProperty.GotoCondition; } }
獲取workflow處理器
/// <summary> /// 獲取workflow處理器 /// </summary> public static WorkflowRuntime CurrentWorkflowRuntime { get { if (workflowRuntime == null) { workflowRuntime = new WorkflowRuntime(); //加載通訊服務 ExternalDataExchangeService dataService = new ExternalDataExchangeService(); workflowRuntime.AddService(dataService); localService = new LocalService.LocalService(); dataService.AddService(localService); //加載持久化服務 string connStr = System.Configuration.ConfigurationManager.AppSettings["WF.PersistenceDB.ConnectionString"].ToString(); SqlWorkflowPersistenceService WorkflowPersistenceService = new SqlWorkflowPersistenceService(connStr); //bool unloadOnIdle = false; //TimeSpan instanceOwnershipDuration = new TimeSpan(0, 0, 3); //TimeSpan loadingInterval = new TimeSpan(0, 0, 1); //SqlWorkflowPersistenceService WorkflowPersistenceService = // new SqlWorkflowPersistenceService(connStr, unloadOnIdle, instanceOwnershipDuration, loadingInterval); //NameValueCollection parms = new NameValueCollection(); //parms.Add("UnloadOnIdle", "true"); //parms.Add("ConnectionString", connStr); //SqlWorkflowPersistenceService WorkflowPersistenceService = // new SqlWorkflowPersistenceService(parms); workflowRuntime.AddService(WorkflowPersistenceService); //相應流程事件 workflowRuntime.WorkflowIdled += OnWorkflowIdled; workflowRuntime.WorkflowStarted += OnWorkflowStarted; workflowRuntime.WorkflowTerminated += OnWorkflowTerminated; workflowRuntime.WorkflowCompleted += OnWorkflowCompleted; ////加載跟蹤服務 //SqlTrackingService sqlTrackingService = new SqlTrackingService(DBAccess.connectionString); //sqlTrackingService.IsTransactional = false; //workflowRuntime.AddService(sqlTrackingService); workflowRuntime.StartRuntime(); } return workflowRuntime; } }
Runtime 服務
WorkflowRuntime類僅僅提供了執行工作流的基本功能,之前我們提到的一些重要功能(比如跟蹤工作流)則可以通過WorkflowRuntime提供的擴展性機制-AddService方法來實現.
AddService允許我們向Runtime中添加可用的服務.這些服務可以是我們為特定領域編寫的自定義服務,也可以是WF中內置的服務.
調度服務 Scheduling Services
調度服務用來控制Runtime執行工作流所需要的線程.
DefaultWorkflowSchedulerService會創建新的線程來執行工作流.因為工作流和宿主應用程序的線程是分開的,所以工作流是異步執行的並且不會阻止任何應用程序的線程.我們還可以配置允許同時執行的工作流最大數量.
當宿主應用程序可以轉讓線程給工作流Runtime時可以使用另外一個調度服務-ManualWorkflowSchedulerService.對服務器端應用程序(比如ASP.NET Web應用程序和Web Service)而言,把線程轉讓給Runtime非常有用.服務器端應用程序通常的做法是為每個客戶端請求的服務創建線程.而宿主應用程序把線程”借給”WF Runtime的意義在於可以讓Runtime在每個請求的線程上同步地執行工作流,而不是為每個請求創建兩個線程.
和Windows Worklow的所有服務一樣,如果內置的服務不能滿足你的需求,你可以定義你自己的調度服務.
事務服務 Transaction Services
事務服務允許Runtime保持位於工作流內部和持久存儲器(durable store)中的狀態的一致性.默認的事務服務是DefaultWorkflowTransactionService類的實例.正在運行的工作流進程中的活動和此服務共享相同的進程和相同的事務上下文.
WF依靠.NET中的System.Transactions名稱空間來實現事務機制. Transactions類提供一個輕量級的, auto-enlisting並且可提升的事務.事務像本地事務一樣啟動,然后Runtime可以根據需要把它提升為重量級的分布式事務.
持久化服務 Persistence Services
持久化服務負責把工作流狀態保存到持久儲存器.SqlWorkflowPersistenceService會把工作流狀態保存到SQL Server數據庫.長時間運行的工作流需要持久化服務,因為我們不能讓處理訂貨單的工作流在內存里駐留30天直到客戶支付才從內存中卸載.相反,Runtime應該保持工作流的狀態到持久存儲器中,並且把工作流實例從內存中卸載.在這30天中,Runtime可以重新加載工作流實例並恢復運行.當持久化服務啟用時,WF Runtime會自動保持工作流空閑或者暫停等狀態.
SqlWorkflowPersistenceService支持SQL Server 2000以及更高版本(還包括免費的MSDE和Express版).當然,我們還需要一個數據庫架構來讓持久化服務知道如何去保存工作流狀態,這部分內容將在后面的章節詳述.
跟蹤服務 Tracking Services
當調度服務選擇了工作流運行的線程之后,跟蹤服務就會負責監視並記錄工作流的執行信息.跟蹤服務使用Tracking Profile來通知Runtime它需要的工作流信息的類型.跟蹤服務還可以打開跟蹤頻道(Tracking Channel)來接收事件和數據.WF包含一個SqlTrackingService類,這個類可以將跟蹤數據存儲到SQL Server數據庫.跟蹤服務將使用事務服務來確保工作流的跟蹤數據與被跟蹤工作流的狀態一致.默認Runtime不會啟動跟蹤服務,但我們可以用編程的方式添加跟蹤服務(或使用應用程序配置文件配置跟蹤服務).
獲取workFlow的模板
/// <summary> /// 獲取workFlow的模板 /// </summary> /// <param name="workFlowName"></param> /// <returns></returns> private Type GetWorkFlowType(string workFlowName) { Type wfType = null; if (workFlowName.Equals("Diagnosis", StringComparison.OrdinalIgnoreCase)) wfType = typeof(CTDiagnosis); return wfType; }
獲取workflow 的實例ID
/// <summary> /// 獲取workflow 的實例ID /// </summary> /// <param name="workflowName"></param> /// <param name="startParameter"></param> /// <returns></returns> public Guid NewWorkflow(string workflowName, object startParameter) { Dictionary<string, object> inputParameters = new Dictionary<string, object>(); inputParameters.Add("MyActivityDataProperty", startParameter); //啟動一個新的工作流 WorkflowInstance workflowInstance = CurrentWorkflowRuntime.CreateWorkflow(GetWorkFlowType(workflowName), inputParameters); workflowInstance.Start(); //重新從持久化數據庫中加載工作流,這是必須的,否則GetLoadedWorkflows無法獲得新加入的流程。 CurrentWorkflowRuntime.GetWorkflow(workflowInstance.InstanceId); //ReloadWorkflow(); return workflowInstance.InstanceId; }
獲取workflow的狀態
/// <summary> /// 獲取workflow的狀態 /// </summary> /// <param name="instanceId"></param> /// <returns></returns> public string GetInstanceStateByInstanceId(Guid instanceId) { string strStatus = ""; StateMachineWorkflowInstance smwi = new StateMachineWorkflowInstance(WorkflowMgr.CurrentWorkflowRuntime, instanceId); strStatus = smwi.CurrentStateName; return strStatus; }
總結
狀態機工作流的持久化很重要,要不workflow重啟時,得不到正確的狀態.
參考文獻
《WF編程》系列之4 - 漫游工作流:Widows Workflow Runtime及其服務 http://www.cnblogs.com/xiaoshatian/archive/2007/03/30/693687.html
歡迎各位參與討論,如果覺得對你有幫助,請點擊 推薦下,萬分謝謝.
作者:spring yang
出處:http://www.cnblogs.com/springyangwc/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。