李政儀王 平
(1.長沙民政職業技術學院軟件學院,湖南 長沙 410004;2.長沙拓維有限公司,湖南 長沙 410005)
基于J2EE的工作流引擎調度器的分析與設計
李政儀1王 平2
(1.長沙民政職業技術學院軟件學院,湖南 長沙 410004;2.長沙拓維有限公司,湖南 長沙 410005)
工作流技術是計算機應用領域的一個較新的研究方向,引擎調度器是工作流管理系統的核心。文中以某通信公司的辦公自動化系統為背景,從體系結構、系統功能和關鍵類的設計思想等方面對其中的引擎調度器進行分析,并給出了引擎調度器的核心算法。
工作流技術;工作流管理系統;引擎調度器
工作流技術是實現企業業務過程建模、業務過程仿真分析、業務過程優化、業務過程管理與集成,從而最終實現業務過程自動化的核心技術[1]。工作流引擎是工作流管理系統的核心,是一個為工作流實例提供運行執行環境的軟件服務或“引擎”,它是企業經營過程的任務調度器,在某種程度上還是企業資源的分配器。如何完成對工作流的管理是工作流管理的核心問題。工作流引擎可以為一個工作流實例提供執行環境。提供的服務包括:過程模型的解釋、過程實例的控制、在過程各活動之間的游歷、生成工作項、通知用戶進行處理、工作流控制數據和工作流相關數據的維護、調用外部應用和訪問工作流相關數據等[2]。可見,工作流引擎也是實現工作流管理的唯一通道。工作流引擎可以分為消息隊列組件、XML解析組件、引擎調度器、條件規則組件、數據庫組件、異常處理組件和腳本解釋組件。其中,引擎調度器是工作流引擎的調度和處理入口,是工作流引擎中的核心部件。本文將從體系結構、功能和算法等幾個方面對引擎調度器進行分析與設計,該引擎調度器具有良好的可擴展性,可在一般的企業中應用,改善了企業辦公環境,提高了企業業務水平。
本文設計的工作流引擎調度器用J2EE架構實現,其核心用EJB和JSP編寫。J2EE表現層技術包括servlets,JSP pages,and JSF組件,客戶將通過瀏覽器與WEB容器交互。用這種方式可以實現基于Web的管理,從而簡化工作流引擎的配置。由于EJB具有一定的事務處理能力,因此用這種方法實現的工作流引擎調度器也具有一定的事務處理能力,從而可以使數據的一致性得以保證。再加上EJB服務器配置靈活并能進行安全管理,也使得工作流引擎調度器具有了上述特性。同時此調度器的設計是以數據庫管理系統為核心的,數據庫的訪問效率直接關系到工作流引擎的效率。由于EJB服務器可以提供數據庫連接池的功能,可以提高數據庫的訪問效率。因此,用EJB實現工作流引擎可以改善它的效率。對于企業原有的信息系統,通過Java-Com Bridge或CORBA/RMI IIOP接入系統,成為一個可為系統管理的對象,由對象管理器控制,而EJB Server由一系列企業Beans組成,完成對工作流的各種控制。系統的核心部分用EJB編寫,因此可以利用EJB服務器的一些特性進行系統的有效管理。對于小型系統可以只配置一個服務器,對于大型系統可以將EJB服務器集群,并可將EJB分發到不同的服務器上,再加上服務器提供的連接池以及事務處理能力,提高了系統的處理性能。引擎調度器的結構如圖1所示。

圖1 引擎調度器結構
引擎調度中心的功能在于接受從外部接口發送過來有關流程控制的請求(如業務初始化、獲取任務以及結束任務等),然后根據不同的請求類型調用相應的處理組件完成與本次請求相關的操作,并返回操作結果。由于是在數據庫管理系統(DBMS)內部實現工作流引擎的控制模型,因此,有關請求的并發處理等問題完全可以由DBMS完成,也不需要諸如請求隊列等形式的數據結構。所以實際上可以將調度中心看成一個多線程的并發服務器,它可以對多個外部請求提供并發服務[4-5]。對外部請求的處理過程中肯定會涉及到對內部數據結構中有關數據的讀寫和更改操作,這些數據的完整性和互斥操作則可以通過DBMS提供的各種加鎖機制來實現,從而實現了多個外部請求之間的獨立性。
主要根據調度中心的指示完成諸如任務創建、任務狀態的轉換以及相關數據的維護等工作。
任務指派處理只是針對常規交互活動,通常情況下,在任務狀態由Pending切換到Waiting過程中完成任務的指派工作,即處于就緒狀態的任務在通常情況下都確定了其執行者。任務指派過程首先根據任務指派基準確定可以執行此任務的群體人員,通常情況下這是一個包含多個人員的集合;然后根據任務指派方法確定由這個群體中的哪些個體來執行任務。
路由選擇器的功能是選擇后繼活動。由于一個過程定義相當于一張有向圖,為了簡化對工作流的控制,要在活動表中記錄每個“活動”結點的入度與出度,通過結點的入度與出度進行同步、選擇與并行控制。為了對結點狀態進行控制,引入一個同步計數器Num,它的初值設為0。如果一個結點的輸入變遷條件為True,則Num加1。若該結點的入度為1,則轉變該結點的狀態為“就緒”狀態。否則再由結點類型來判斷。若該結點類型為XOR-Join,則轉變該結點的狀態為“就緒”狀態;若該結點類型為AND-Join,如果Num的值與結點入度相等,則轉變該結點的狀態為“就緒”狀態,否則結點狀態不變。通過此種方式實現了對結點的選擇與同步控制。
當應用發出“結束任務”的外部請求時,該請求將觸發引擎調度中心啟動“轉發控制”。
負責常規自動活動的所對應的自動執行體的啟動并對其活動進行監控。
外部接口是用戶使用、查看、管理工作流引擎的通道,包括:
(1)數據接口。與工作流管理系統進行數據交互,包括工作流運轉過程中數據信息、交互信息和控制信息;
(2)管理接口。用于系統管理員查看工作流引擎的狀態、控制工作流引擎的啟動、暫停、繼續、停止等,以及工作流引擎發生災難性異常時,負責相關數據的導入、導出;
(3)日志接口。提供工作流引擎的運轉情況信息和異常信息等,便于管理員查看維護。
采用Jsp和JavaBean來實現最終的Web頁面,包括分類顯示可啟動的業務流程、待處理的任務列表、待領取的任務列表、圖形化顯示工作流的處理進度、多條件組合查詢、工作流進度管理。
引擎調度器是整個工作流引擎的核心組件,主要功能包括:
(1)解釋流程定義:流程的定義以特有的形式存放于數據庫之中,為了驅動流程的運行,必須從數據庫中取出定義,轉換為可理解的形式,供其它組件參考,即提取出實例文檔中的元素、屬性和數據,以便對這些信息進行操作。解析XPDL文檔必須嚴格遵守語法規范,格式良好是對文檔最基本的要求。解釋器通過工作流模型ID在工作流模型庫中查找相應的過程定義,并利用XML綁定技術解析出其中的“活動”與“變動”信息,存入相應的流程定義表(該表存儲與活動相關的信息,其中起始活動必須進行標識)。解析是用某種方法在分析XML文檔的組成結構上采用兩種模型:線性模型(SAX模型)和樹模型(D0M模型)。SAX是針對XML的簡單API,采用基于事件的順序執行機制;而DOM則提供了一種通過分層對象模型訪問XML文檔的信息,這正與XML的分層結構相吻合,給隨機訪問帶來了方便。在流程定義表中,由于從起始活動開始,在“變動”表中可以找到所有的后繼活動,因此可以遍歷所有活動,它相當于有向圖的一種表示方法。
(2)控制過程實例(創建,激活,流轉,終止等):客戶端對流程的操作,基本上都可以分割為創建、激活、流轉和終止等幾個方面,針對這幾類操作,再加上一些輔助的信息,引擎調度器要求能夠將以上所有的操作轉換為對數據庫的邏輯操作。
(3)過程控制管理[3],它負責以下工作:初始化工作流引擎,生成工作流模型;啟動工作流引擎,從過程實例庫中讀取處于運行狀態的過程實例,與條件判定器交互獲取條件判定結果,并且生成過程實例,存儲在過程實例庫中;從事件處理庫中讀取事件處理方法,與條件判定器交互獲取條件判定結果,并且生成事件處理程序,存儲在事件處理庫中等。
(4)按照過程定義已確定的業務邏輯調用各項活動:在流程的每一步流轉的過程中,流程定義中可能還包含了很多額外的業務邏輯調用設定,比如特定的腳本、特定的附加組件等,在每一次的操作中一旦這些設定被激活,引擎調度器將要根據事先的設定,正確而又及時的調用這些邏輯活動。
引擎調度器的用例圖如圖2所示。

圖2 工作流引擎的引擎調度器用例圖
活動者包括工作流監控端、工作流定義數據庫、工作流運行數據庫及組織機構數據庫。其中,工作流客戶端作為接受用戶交互的界面部分,將用戶所作的行為,按照固定的規則,通過其他模塊將請求交給引擎調度器。流程監督者作為接收系統管理員交互的界面部分會對系統做出調整,然后發送給具體的處理模塊進行處理。其余的工作流定義數據庫等活動者,負責將引擎調度器每一步的操作與狀態記錄到數據庫中,以便永久保存。用例包括資源定位、引擎容器、定義裝載、流程監督。其中,引擎容器通過資源定位系統所用到的資源表,引擎容器用例使用資源定位用例。引擎容器不直接與用戶交互,活動者對工作流的參與都是通過流程監督這個工作流執行模塊的入口來進行。引擎容器通過定義裝載將現有的工作流定義裝入,這樣才能運行該工作流,引擎容器用例與資源定位用例之間是使用關系。
根據以上引擎調度器用例的分析得出:所有的流程運轉都將在引擎調度器上進行,因此,引擎調度器應該有自己的狀態,并且外界可以對該調度器進行操作。基于這一點,此處將引擎調度器這個實體建模為WorkFlowIns類。由于引擎調度器需要根據不同的用例達到對各個流程實例的控制,因此添加WorkEngineCntrls類,表示引擎調度管理器。同時,由于工作流引擎中有許多類型的實體,如流程定義、流程實例、活動和相關數據等,根據面向對象的設計原則[6],將這些實體的操作封裝在這個實體內部。在系統中,由于有多個WorkFlowDefine類和WorkFlowIns類的實例在運行,因此WorkEngineCntrls類與WorkFlowDefineCls等類的關系應該是一對多的關系,也就是關聯。在WorkFlowIns類中除了基本的工作流屬性標識id與名稱name,還需增加相應的對應工作流的url、初始狀態state、前一個狀態prestate、下一個狀態nextstate,主要方法包括設置工作流地址seturl()、獲取工作流地址geturl()以及工作流初始控制flowInsCtrol()。WorkContrl工作控制類是引擎調度器最重要的類之一,其中的4個方法主要應用在調度過程中。Data類是為了獲取相應的數據或設置數據。另外,由于引擎調度器在執行時可能產生錯誤,為了將這些錯誤捕獲,設置了相應的異常類O-prationException。綜合以上分析,引擎調度器的類圖如圖3所示。

圖3 工作流引擎調度器的類圖
每次引擎調度器開始工作時,必須要先調用start()方法,使引擎調度器開始自動運行,引擎調度器的算法步驟為:
Step1.執行引擎。注冊執行引擎啟動時,通過EJB遠程調用主控引擎的引擎管理器,將自身注冊到主控引擎的主控狀態機上;
Step2.當主控引擎收到客戶啟動流程的請求后,引擎調用過程實例加載器,將需要啟動的流程定義加載到運行庫;然后由過程實例加載器調用過程定義解釋器,將XML流程定義轉化為Process流程定義對象。同時建立流程實例列表。
*加入第一個流程實例;
*依次加入流程實例;
*加入最后一個流程實例;
Step3.初始活動執行。主控引擎調用活動執行處理器,執行流程的第一個初始活動;
*If(判斷流程實例列表為空)
then引擎等待或掛起
else得到第一個流程實例;
*If(當前實例=下一個實例)
then執行完成,進入第3步。
else處理下一個流程實例。
Step4.發送狀態變更通知。活動執行處理器執行完畢后,將此活動作為參數調用引擎管理器的Notification()方法,發送已執行的通知。
*檢測當前流程實例觸發條件是否達到,相關數據是否完備;
*按照當前流程實例處理描述,進行流程實例操作,如果操作成功則觸發目標,并傳送相關數據;
*記錄相關日志信息;
*將相關數據信息、交互信息返回給用戶,并更改節點狀態和優先級。
Step5.獲取后繼活動。引擎管理器根據已執行活動取得其后繼活動及工作流相關數據并動態調度執行引擎,執行引擎的流實例列表;
Step6.主控狀態機給執行引擎發送通知,主控狀態機監聽到消息后,調用Changed()方法改變自身狀態,調用NotifyObserver()方法,通知所有注冊的執行引擎的觀察器,回調每個執行引擎的update()方法;
Step7.執行引擎執行活動。如果執行引擎的URL與參數中的URL一致,則執行引擎的觀察器調用自身的活動處理器,執行當前活動。活動執行完畢,再調用引擎管理器的Notification()方法,再次循環執行Step4~Step7,直到整個流程結束;
Step7.流程結束,整個流程執行完畢,調用清除器清除相關的實例數據。
引擎調度器是工作流引擎的調度和處理入口,是工作流引擎中的核心部件。本文通過對工作流引擎調度器的體系結構、功能進行分析,給出了相應的用例圖、類圖以及調度算法。本文設計并開發的工作流引擎調度器,已經應用到了某通信公司辦公自動化系統中,并取得了較好的應用效果。
[1]羅海濱,范玉順,吳澄.工作流綜述[J],軟件學報,2000,11,(7):899-907.
[2]劉鐵銘,范玉順.基于工作流管理方式的應用協作模塊分析與設計[J].計算機工程與應用,1999,35(2):56-62.
[3]范玉順.工作流管理技術基礎-實現企業經營過程重組與經營過程自動化的核心技術[M].北京:清華大學出版社,2001.
[4]史美林,楊光信等.一個基于Web的工作流管理系統[J].軟件學報.,1999,10(11):1148-1155.
[5]WfMC.Workflow Management Coalition Specification:Terminology&Glossary[J].Document Number WFMC-TC-1011,Brussels,1996
[6]Joseph Schmuller.UML基礎、案例與應用[M].北京:人民郵電出版社,2002.
TP316
A
1671-5136(2011) 01-0123-04
2011-03-20
李政儀(1979-),女,湖南石門人,長沙民政職業技術學院軟件學院講師、碩士。研究方向:軟件工程與計算機應用;王平(1975-),女,湖南洪江人,長沙拓維有限公司助理工程師、碩士。研究方向:工作流技術。