標籤:
Windows Workflow Foundation技術介紹(基於.NET Framework 4.5)
轉自:http://www.cpiso.cn/jsyj/ghxx/2014/5/15/459.shtml
Microsoft Windows Workflow Foundation (WF) 是一個可擴充架構,用於在 Windows 平台上開發工作流程解決方案。Windows Workflow Foundation 同時提供了 API 和一些工具,用於開發和執行基於工作流程的應用程式。Windows Workflow Foundation 提供單個統一的模型,以便建立跨越多個類別應用程式的端到端解決方案,包括人力工作流程和系統工作流程。
Windows Workflow Foundation 是一個廣泛且通用的工作流程架構,並且從下到上、在每個層級都針對可擴充性進行了設計。基於 Windows Workflow Foundation 的解決方案,由得到 Microsoft .NET 代碼支援且在宿主應用程式中啟動並執行互連組件組成。就像在定製的環境中以可視方式建立 Web 頁一樣,您需要在可視設計器中制訂特定工作流程的步驟,並且添加程式碼後置工作流程組件以實現規則並定義業務過程。
Windows Workflow Foundation 在構建工作流程時具有很強的優勢。
1、Windows Workflow Foundation 提供了一套高度抽象和可視化的商業處理模型,這套模型可以非常容易地使用和被理解,無論使用它的是開發人員或是商業領域專家。
2、Windows Workflow Foundation 可以非常容易地改變與之相關的商業處理規則,並且不必重新編譯。
3、Windows Workflow Foundation 編程模型可以使開發人員建立一套可測試的核心集合,並且可以在多個程式中使用它們。
Windows Workflow Foundation 是一個專門控制工作流程的程式,它為開發工作流程提供了架構、模型、工作流程引擎、.NET 託管API、運行庫服務以及與 Microsoft Visual Studio 整合的視覺化設計工具和調試器,可使用 Windows Workflow Foundation 來產生並執行同時跨越用戶端和伺服器端的,可在所有類型的 .NET 應用程式內部執行的工作流程。
Windows Workflow Foundation 的核心是一組 Activities 活動,通常在宿主程式中被建立。它們通過工作流程引擎來運行工作流程,管理工作流程的狀態,通過運行時服務與工作流程進行通訊。宿主程式可以是任何類型的程式,在開發工作流程項目時,首先在宿主程式中建立工作流程引擎,然後在引擎中載入各種所需的服務,最後通過引擎啟動指定的工作流程並產生工作流程的執行個體。
宿主程式與工作流程之間進行資料交換是通過通訊 Service 服務,另外也可自行設計通訊通道,定義一些介面,使宿主程式與 Windows Workflow Foundation 中一些特殊的 Activity 活動採用事件傳遞參數的形式進行通訊,來交換資料;同時還可以通過外來事件以及持久化等方式實現通訊。當一個工作流程執行個體運行時,可以伴隨其運行許多服務,這些服務均採用可插式調用,即這些服務是為了滿足不同的工作流程運行執行個體的需求,從而伴隨執行個體啟動並執行。
載入工作流程持久化服務(PersistenceService)可以將工作流程執行個體從工作流程引擎中移出,存入持久性介質,以及從介質中將執行個體載入工作流程引擎中。WorkflowPersistenceService 類是使用資料庫對工作流程狀態進行持久化的服務,執行個體使用 Unload 方式通過載入到引擎中的 WorkflowPersistenceService 服務,完成執行個體的記憶體移出與儲存到資料庫的操作,引擎使用 GetWorkflow 方法,可通過 WorkflowPersistenceService 服務將存於資料庫中的執行個體載入並返回,執行個體使用 Load 方法可觸發引擎的 WorkflowLoaded 事件。
跟蹤工作流程及其節點狀態是工作流程平台的核心功能 Windows Workflow Foundation 提供的 Tracking 服務用以跟蹤工作流程的執行狀態,工作流程執行過程中會有各種狀態的改變,Tracking 能將這些狀態改變資訊記錄到資料庫並提供查詢連接埠。另外在封裝類中還實現了對自訂服務的載入,同時負責工作流程引擎的啟動,並保證工作流程引擎的唯一性。
在開發工作流程系統時,Windows Workflow Foundation 使程式語義更具聲明性且準確性增強,方便使用者為接近實際進程的應用程式建模,並將 WindowsWorkflow 嵌入運行時伺服器。進程越複雜,為其設計和實現的流程就越簡單,進程動態更改越容易,使用者需要編寫和維護的代碼數量就越少。Windows Workflow Foundation 運行時為工作流程序提供了託管執行環境,還為程式提供了期間、可靠性、掛起/恢複、事務以及補償特徵。
1 WINDOWS 工作流程概念性概述
1.1 WINDOWS 工作流程概述
工作流程是由以活動作為基本單元的一個模型,用於描述實際進程。工作流程提供了一種方法,用於描述多項短期運行或長期啟動並執行工作之間的執行順序和依賴關係。此工作從頭到尾地貫穿模型,並且活動可以人工執行或由系統功能執行。
1.1.1 工作流程運行時引擎
每個正在啟動並執行工作流程執行個體都是由進程內運行時引擎建立和維護的,宿主進程通過以下三種方式與其互動:
WorkflowInvoker,它像調用方法一樣調用工作流程。
WorkflowApplication,用於對單個工作流程執行個體的執行進行顯式控制。
WorkflowServiceHost,用於多執行個體方案中基於訊息的互動。
上述每個類將在核心活動運行時作為負責執行的活動執行個體進行封裝。在一個應用程式定義域中可以並發運行多個活動執行個體對象。
上述三個宿主互動對象中的每一個都是從名為工作流程序的活動樹中建立的。使用這些類型或對活動執行個體進行封裝的自訂宿主,可以在包括控制台應用程式、基於表單的應用程式、Windows 服務、ASP.NET 網站和 Windows Communication Foundation (WCF) 服務在內的任何 Windows 進程內執行工作流程。
宿主進程中的工作流程組件(圖1)
1.1.2 工作流程組件之間的互動
示範工作流程組件彼此之間如何進行互動(圖2)
在中,Invoke() 方法的 WorkflowInvoker 類用於調用幾個工作流程執行個體。 WorkflowInvoker 用於不需要由宿主管理的輕型工作流程;需要由宿主管理的工作流程(如 Bookmark 恢複)必須改用 Run() 來執行。無需等待一個工作流程執行個體完成即可調用下一個工作流程執行個體;運行時引擎支援同時運行多個工作流程執行個體。調用的工作流程如下:
一個包含 WriteLine 子活動的 Sequence 活動。 Variable 的父活動是綁定到 InArgument 的子活動。
一個調用 ReadLine 的自訂活動。將 ReadLine 活動的 OutArgument 返回給調用 Invoke() 方法。
一個派生自 CodeActivity 抽象類別的自訂活動。 CodeActivity 可以使用作為 Execute(CodeActivityContext) 方法的參數提供的 CodeActivityContext 訪問運行時功能(如跟蹤和屬性)。
1.2 WINDOWS 工作流程基礎概念
1.2.1 工作流程與活動
工作流程是構成進程模型的操作的結構化集合。工作流程中的每個操作都建模為一個活動。主機將 WorkflowInvoker 用於調用工作流程(就好像是一個方法),將 WorkflowApplication 用於對單個工作流程執行個體的執行進行顯式控制,並將 WorkflowServiceHost 用於在多執行個體方案中進行基於訊息的互動,從而實現與工作流程的互動。由於工作流程的步驟定義為活動的階層,因此層級中最頂端的活動可以認為是定義工作流程本身。此階層模型替代以前版本中的顯式 SequentialWorkflow 和 StateMachineWorkflow 類。活動自身可作為其他活動的集合(使用 Activity 類作為基礎,通常使用 XAML 定義)開發;或者使用 CodeActivity 或 NativeActivity 類進行自訂建立,前者可以使用運行時進行資料訪問,而後者則向活動作者公開工作流程運行時範圍。使用 CodeActivity 和 NativeActivity 類開發的活動是使用符合 CLR 的語言建立的,如 C#。
1.2.2 活動資料模型
活動使用下表中所示的類型儲存和共用資料。(表1)
1.2.3 工作流程運行時
工作流程運行時是工作流程進行執行的環境。WorkflowInvoker這是執行工作流程的最簡單的方法。宿主為以下操作使用WorkflowInvoker:
1、以同步方式調用工作流程。
2、向工作流程提供輸入或從其中檢索輸出。
3、添加供活動使用的擴充。
ActivityInstance是安全執行緒的代理,宿主可以使用該代理與運行時進行互動。宿主為以下操作使用ActivityInstance:
1、通過建立執行個體或從執行個體儲存區中載入執行個體的方法來擷取執行個體。
2、接收執行個體生命週期事件通知。
3、控制工作流程執行。
4、向工作流程提供輸入或從其中檢索輸出。
5、向工作流程發出繼續訊號並將值傳遞到工作流程中。
6、儲存工作流程資料。
7、添加供活動使用的擴充。
活動通過使用相應的ActivityContext衍生類別獲得訪問工作流程運行時環境的許可權,例如NativeActivityContext或CodeActivityContext。這些元素使用此類來解析參數和變數,以便安排子活動和實現多種其他用途。
1.2.4 服務
工作流程提供一種使用訊息活動實現和訪問松耦合服務的自然方法。訊息活動建立在WCF上,目的是完成工作流程資料的輸入與輸出。可將訊息活動組合在一起,以對任何你希望的訊息交換模式進行建模。
1.2.5 持久性、卸載和長時間啟動並執行工作流程
Windows 工作流程通過提供以下功能,簡化了創作長時間啟動並執行反應式程式的過程:
訪問外部輸入的活動。
能夠建立可由宿主偵聽程式恢複的 Bookmark 對象。
能夠儲存工作流程資料並卸載工作流程,然後作為對特定工作流程中恢複 Bookmark 對象的響應,重新載入和重新啟用工作流程。
工作流程會持續地執行活動,直到沒有任何要執行的活動或者所有當前正在執行的活動均在等待輸入為止。在後一種情況下,工作流程處於空閑狀態。通常宿主會卸載進入空閑狀態的工作流程,並在收到訊息時將其重載到繼續執行。WorkflowServiceHost為此功能提供功能,並提供了可擴充的卸載政策。如果在執行塊中使用可變狀態資料或無法儲存的其他資料,活動可以使用NoPersistHandle向宿主指示不應儲存它。工作流程還可以使用 Persist 活動將其資料顯式儲存到持久性儲存介質中。
1.3 WINDOWS 工作流程體繫結構
Windows Workflow Foundation (WF) 提升了開發長時間啟動並執行互動式應用程式的抽象層級。工作單元封裝為活動。活動運行環境提供用於流量控制、異常處理、錯誤傳播、狀態資料儲存、從記憶體載入和卸載進行中的工作流程、跟蹤以及事務流的功能。
1.3.1 活動體繫結構
活動作為 CLR 類型開發,這些類型或者派生自 Activity、CodeActivity或AsyncCodeActivity,或者派生自返回某個值的對應NativeActivity、Activity<TResult>、CodeActivity<TResult> AsyncCodeActivity<TResult>或NativeActivity<TResult>變體。通過開發派生自 Activity 的活動,使用者可以組合預先存在的活動,以便快速建立在工作流程環境中執行的工作單元。另一方面,CodeActivity支援通過將CodeActivityContext主要用於訪問活動參數,在Managed 程式碼中創作執行邏輯。AsyncCodeActivity類似於CodeActivity除外,它可以用於實現非同步任務。通過開發派生自NativeActivity的活動,使用者可以通過NativeActivityContext訪問運行時,以實現安排子級、建立書籤、調用非同步工作、註冊事務等功能。
1.3.2 活動上下文
ActivityContext是活動作者的工作流程運行時介面,提供對諸多運行時功能的訪問。下面的樣本定義一個使用執行內容建立書籤(一種機制,允許活動在其執行中註冊一個延續點,該延續點可由將資料傳入活動的主機恢複)的活動。
1.3.3 活動生命週期
活動執行個體啟動時處於 Executing 狀態。除非發生異常,否則活動將保持此狀態,直到已完成執行所有子活動和所有其他掛起的工作(如 Bookmark 對象),此時,該活動將轉換為 Closed 狀態。活動執行個體的父級可以請求取消子級;如果可以取消子級,該子級處於 Canceled 狀態時完成。如果在執行期間引發異常,運行時會使將活動推入 Faulted 狀態,並將此異常向上傳播到活動父鏈。下面列出了活動的三個完成狀態:
已關閉:活動已完成其工作並退出。
已取消:活動已正常放棄其工作並退出。當進入此狀態時,不會顯式復原工作。
出錯:活動已遇到錯誤,並且在未完成其工作的情況下退出。
當儲存或卸載活動時,活動會保持 Executing 狀態。
2 工作流程應用情境
2.1 文檔審批過程
這個用例結合了很多WF4.0和WCF的功能。使用這兩種技術實現了一個檔案的審批。包括一個用戶端應用程式,它提交檔案、審批檔案;審批次程序管理應用程式方便用戶端之間的通訊,並執行該審批程式的規則。這個用例中有3種類型的審批工作流程:
1、一個簡單的審批次程序
2、一個quorum審批次程序
3、一個複雜的審批次程序
其流程架構圖如下(圖3):
從用戶端來看,審批次程序有如下功能:
1、在用戶端可以申請一個使用者
2、用戶端的WCF調用服務端的WCF服務。
3、一個唯一的user ID返回給用戶端,此時使用者才可以開啟一個審批次程序。
4、用戶端可以發起一個審批檔案,進行簡單的、quorum或複雜的審批程式。
5、在用戶端的介面審批按鈕被點擊後,在用戶端工作流程服務宿主中啟動一個工作流程執行個體。
6、工作流程向服務端發送一個核准請求。
7、服務端自身也啟動一個工作流程,回應審批次程序。
8、一旦執行完服務端的審批工作流程,就結果發送回用戶端。
9、用戶端顯示的結果。
10、用戶端會收到核准請求,可以在任何時間響應審批要求。
11、宿主在用戶端的WCF服務可以收到來自服務端的審批要求。
12、呈現審查的檔案資料。
13、使用者可以批准或否決該文檔。
14、WCF用戶端發送一個響應返回給服務端。
從服務端的角度來看,審批程式功能如下:
1、用戶端請求參與審批次程序。
2、服務端的WCF服務能接受用戶端請求
3、為用戶端產生一個唯一的ID。將使用者資訊儲存在資料庫中。
4、唯一的ID發送回給使用者。
5、接受核准請求,執行審批次程序
6、收到一個請求批准理,開啟新的工作流程。
7、根據請求的類型(簡單,quorum,或複雜),不同的工作流程活動被執行。
8、相關的發送和接收活動被用來給用戶端發送請求獲批准的審查和等待接收響應。
9、此次獲批准的工作流程的結果發送到用戶端。
樣本:
1、 啟動服務端後啟動四個用戶端,並完成與服務端串連(圖4)
圖5:
2、 分別申請使用者(對應三種使用者類型)
見圖6
3、 建立一個複雜檔案審批次程序
見圖7
4、 A使用者提交後B、C將收到審核任務,可以選擇同意與否決
見圖8
5、 B、C同意後,審批任務將送達到D
見圖9
6、 D審批提交後,A將收到反饋資訊,審批次程序結束
見圖10
Windows Workflow Foundation技術介紹(基於.NET Framework 4.5)