雖然Windows workflow是實施商務程序處理的一個優秀架構,但它卻缺乏對人工活動的直接支援。 微軟雖然發布了幾種方法來解決這個問題,但這些方法卻顯得不夠通用。本文將定義一種完全通用的方法,在WF中實現對人工活動的支援。
支援人工互動的複雜性帶來眾多的挑戰,如下所列,可見一斑:
使用者的回應時間(使用者活動的執行時間)是不可預知的。
當請求發生的時候使用者可以不串連到系統,因此需要儲存請求,併當使用者登入到系統之時提交給使用者。
在不同的機器上可以有多個同時啟動並執行工作流程。但是使用者通常需要一個所有任務的統一視圖。
業界已經認識到了這些問題,並制定了兩個主要的規格來解決這些問題。我們將根據以下思想來構建人工活動的實現,而不是紙面上的規格說明書。
一個解決方案的組件視圖
整體解決方案的主要組件如圖1所示。
圖1 解決方案元件
解決方案的核心是一個工作隊列管理器。這是一個集中的服務,負責跟蹤系統所有使用者的所有任務。任何需要人工互動活動的工作流程(或者服務/應用程式所包含的工作流程),都去調用一個自訂的工作流程活動,以通過它將請求提交到工作隊列管理器,並對其進行持久化,同時允許系統的其他組件與這些請求一同協作。這樣,工作隊列管理器就成為了工作流程引擎和人工活動執行之間的解耦層。在工作流程執行期間,如果使用者並不存在於系統中,這種方法同樣提供了支援。同時,工作隊列管理器通過形成的集中服務,可以將所有任務與指定的使用者結合,而不用考慮是從哪裡初始化的流程。因為不同的使用者任務可以要求不同的輸入資訊以及產生不同的輸出,工作流程和人工活動之間的通訊採用了XML進行輸入輸出,從而可以處理任何可能的請求和響應。雖然使用XML似乎會增加實現上的複雜度,但.NET對XML序列化的良好支援,使得XML和對象之間的映射易如反掌。工作隊列查看器是一個GUI應用程式,允許使用者直觀地查看輸入的已經準備就緒的所有任務。該應用程式是通用的,僅僅顯示了任務的基本要素,包括名稱,類型,優先順序,建立者等等。根據隊列中的這些資訊,使用者可以決定執行某一項特定的任務。任務的實際處理過程是通過一個在功能上支援給定任務的任務應用程式來完成的。一個工作流程隊列管理應用程式提供了一個使用者介面,用來支援對工作隊列管理器的管理。它可以查看和修改現有的人工任務,查看它們的記錄等。最後,一個人工活動就是一個自訂活動(參看側邊欄“Windows Workflow Foundation 組件模型”,它實現了與任務隊列管理器的通訊,並為工作流程開發人員展現了一個非常簡單的針對人工任務執行的編程模型。從人工互動的角度來看,這與常規的服務調用並無二致。
Windows Workflow Foundation 組件模型
正如[11]所描述的,Windows Workflow Foundation (WWF)的實現不同於當下主流工作流程實現的可執行工作流程語言(域語言)。在WWF中,“過程圖中的活動關聯了一個實現該活動運行時行為的組件,組件由一種通用程式設計語言實現。過程語言中的每一個活動都對應一個實現組件。例如,一個Web服務調用活動,一個人工任務活動或一個電子郵件活動都對應一個實現組件 ”。
因此,我們能夠非常容易地通過引入新的活動類型擴充WWF,以實現特定情況下的(在我們的案例中,就是人工任務的活動)運行時行為,通過實現新的活動這種方法,使得構建或者擴充現有的過程語言非常簡單。
組件之間的整體互動如順序圖表所示(圖2)
圖2 順序圖表
我們可以看到,上面的整體解決方案裡包含兩種類型的組件:
通用的,包括人工活動,工作隊列管理器和工作隊列查看器。這些組件運行於人工任務的“標準”特性(attributes )之上,並將任務的輸入輸出視為通用的XML。
特殊的,包括工作流程本身和處理商務程序的應用程式,實現了特定業務對象的XML序列化/還原序列化,並使用這些對象實現他們的功能。
本文只討論萬用群組件的解決方案。
工作隊列管理器服務介面和功能
正如我們在前面所定義的那樣,工作隊列管理器是一個集中的服務。它的功能基於資料契約,如圖3所示。
圖3 工作隊列管理器資料契約