李政儀王 平
(1.長沙民政職業(yè)技術學院軟件學院,湖南 長沙 410004;2.長沙拓維有限公司,湖南 長沙 410005)
基于J2EE的工作流引擎調(diào)度器的分析與設計
李政儀1王 平2
(1.長沙民政職業(yè)技術學院軟件學院,湖南 長沙 410004;2.長沙拓維有限公司,湖南 長沙 410005)
工作流技術是計算機應用領域的一個較新的研究方向,引擎調(diào)度器是工作流管理系統(tǒng)的核心。文中以某通信公司的辦公自動化系統(tǒng)為背景,從體系結構、系統(tǒng)功能和關鍵類的設計思想等方面對其中的引擎調(diào)度器進行分析,并給出了引擎調(diào)度器的核心算法。
工作流技術;工作流管理系統(tǒng);引擎調(diào)度器
工作流技術是實現(xiàn)企業(yè)業(yè)務過程建模、業(yè)務過程仿真分析、業(yè)務過程優(yōu)化、業(yè)務過程管理與集成,從而最終實現(xiàn)業(yè)務過程自動化的核心技術[1]。工作流引擎是工作流管理系統(tǒng)的核心,是一個為工作流實例提供運行執(zhí)行環(huán)境的軟件服務或“引擎”,它是企業(yè)經(jīng)營過程的任務調(diào)度器,在某種程度上還是企業(yè)資源的分配器。如何完成對工作流的管理是工作流管理的核心問題。工作流引擎可以為一個工作流實例提供執(zhí)行環(huán)境。提供的服務包括:過程模型的解釋、過程實例的控制、在過程各活動之間的游歷、生成工作項、通知用戶進行處理、工作流控制數(shù)據(jù)和工作流相關數(shù)據(jù)的維護、調(diào)用外部應用和訪問工作流相關數(shù)據(jù)等[2]??梢?,工作流引擎也是實現(xiàn)工作流管理的唯一通道。工作流引擎可以分為消息隊列組件、XML解析組件、引擎調(diào)度器、條件規(guī)則組件、數(shù)據(jù)庫組件、異常處理組件和腳本解釋組件。其中,引擎調(diào)度器是工作流引擎的調(diào)度和處理入口,是工作流引擎中的核心部件。本文將從體系結構、功能和算法等幾個方面對引擎調(diào)度器進行分析與設計,該引擎調(diào)度器具有良好的可擴展性,可在一般的企業(yè)中應用,改善了企業(yè)辦公環(huán)境,提高了企業(yè)業(yè)務水平。
本文設計的工作流引擎調(diào)度器用J2EE架構實現(xiàn),其核心用EJB和JSP編寫。J2EE表現(xiàn)層技術包括servlets,JSP pages,and JSF組件,客戶將通過瀏覽器與WEB容器交互。用這種方式可以實現(xiàn)基于Web的管理,從而簡化工作流引擎的配置。由于EJB具有一定的事務處理能力,因此用這種方法實現(xiàn)的工作流引擎調(diào)度器也具有一定的事務處理能力,從而可以使數(shù)據(jù)的一致性得以保證。再加上EJB服務器配置靈活并能進行安全管理,也使得工作流引擎調(diào)度器具有了上述特性。同時此調(diào)度器的設計是以數(shù)據(jù)庫管理系統(tǒng)為核心的,數(shù)據(jù)庫的訪問效率直接關系到工作流引擎的效率。由于EJB服務器可以提供數(shù)據(jù)庫連接池的功能,可以提高數(shù)據(jù)庫的訪問效率。因此,用EJB實現(xiàn)工作流引擎可以改善它的效率。對于企業(yè)原有的信息系統(tǒng),通過Java-Com Bridge或CORBA/RMI IIOP接入系統(tǒng),成為一個可為系統(tǒng)管理的對象,由對象管理器控制,而EJB Server由一系列企業(yè)Beans組成,完成對工作流的各種控制。系統(tǒng)的核心部分用EJB編寫,因此可以利用EJB服務器的一些特性進行系統(tǒng)的有效管理。對于小型系統(tǒng)可以只配置一個服務器,對于大型系統(tǒng)可以將EJB服務器集群,并可將EJB分發(fā)到不同的服務器上,再加上服務器提供的連接池以及事務處理能力,提高了系統(tǒng)的處理性能。引擎調(diào)度器的結構如圖1所示。
圖1 引擎調(diào)度器結構
引擎調(diào)度中心的功能在于接受從外部接口發(fā)送過來有關流程控制的請求(如業(yè)務初始化、獲取任務以及結束任務等),然后根據(jù)不同的請求類型調(diào)用相應的處理組件完成與本次請求相關的操作,并返回操作結果。由于是在數(shù)據(jù)庫管理系統(tǒng)(DBMS)內(nèi)部實現(xiàn)工作流引擎的控制模型,因此,有關請求的并發(fā)處理等問題完全可以由DBMS完成,也不需要諸如請求隊列等形式的數(shù)據(jù)結構。所以實際上可以將調(diào)度中心看成一個多線程的并發(fā)服務器,它可以對多個外部請求提供并發(fā)服務[4-5]。對外部請求的處理過程中肯定會涉及到對內(nèi)部數(shù)據(jù)結構中有關數(shù)據(jù)的讀寫和更改操作,這些數(shù)據(jù)的完整性和互斥操作則可以通過DBMS提供的各種加鎖機制來實現(xiàn),從而實現(xiàn)了多個外部請求之間的獨立性。
主要根據(jù)調(diào)度中心的指示完成諸如任務創(chuàng)建、任務狀態(tài)的轉(zhuǎn)換以及相關數(shù)據(jù)的維護等工作。
任務指派處理只是針對常規(guī)交互活動,通常情況下,在任務狀態(tài)由Pending切換到Waiting過程中完成任務的指派工作,即處于就緒狀態(tài)的任務在通常情況下都確定了其執(zhí)行者。任務指派過程首先根據(jù)任務指派基準確定可以執(zhí)行此任務的群體人員,通常情況下這是一個包含多個人員的集合;然后根據(jù)任務指派方法確定由這個群體中的哪些個體來執(zhí)行任務。
路由選擇器的功能是選擇后繼活動。由于一個過程定義相當于一張有向圖,為了簡化對工作流的控制,要在活動表中記錄每個“活動”結點的入度與出度,通過結點的入度與出度進行同步、選擇與并行控制。為了對結點狀態(tài)進行控制,引入一個同步計數(shù)器Num,它的初值設為0。如果一個結點的輸入變遷條件為True,則Num加1。若該結點的入度為1,則轉(zhuǎn)變該結點的狀態(tài)為“就緒”狀態(tài)。否則再由結點類型來判斷。若該結點類型為XOR-Join,則轉(zhuǎn)變該結點的狀態(tài)為“就緒”狀態(tài);若該結點類型為AND-Join,如果Num的值與結點入度相等,則轉(zhuǎn)變該結點的狀態(tài)為“就緒”狀態(tài),否則結點狀態(tài)不變。通過此種方式實現(xiàn)了對結點的選擇與同步控制。
當應用發(fā)出“結束任務”的外部請求時,該請求將觸發(fā)引擎調(diào)度中心啟動“轉(zhuǎn)發(fā)控制”。
負責常規(guī)自動活動的所對應的自動執(zhí)行體的啟動并對其活動進行監(jiān)控。
外部接口是用戶使用、查看、管理工作流引擎的通道,包括:
(1)數(shù)據(jù)接口。與工作流管理系統(tǒng)進行數(shù)據(jù)交互,包括工作流運轉(zhuǎn)過程中數(shù)據(jù)信息、交互信息和控制信息;
(2)管理接口。用于系統(tǒng)管理員查看工作流引擎的狀態(tài)、控制工作流引擎的啟動、暫停、繼續(xù)、停止等,以及工作流引擎發(fā)生災難性異常時,負責相關數(shù)據(jù)的導入、導出;
(3)日志接口。提供工作流引擎的運轉(zhuǎn)情況信息和異常信息等,便于管理員查看維護。
采用Jsp和JavaBean來實現(xiàn)最終的Web頁面,包括分類顯示可啟動的業(yè)務流程、待處理的任務列表、待領取的任務列表、圖形化顯示工作流的處理進度、多條件組合查詢、工作流進度管理。
引擎調(diào)度器是整個工作流引擎的核心組件,主要功能包括:
(1)解釋流程定義:流程的定義以特有的形式存放于數(shù)據(jù)庫之中,為了驅(qū)動流程的運行,必須從數(shù)據(jù)庫中取出定義,轉(zhuǎn)換為可理解的形式,供其它組件參考,即提取出實例文檔中的元素、屬性和數(shù)據(jù),以便對這些信息進行操作。解析XPDL文檔必須嚴格遵守語法規(guī)范,格式良好是對文檔最基本的要求。解釋器通過工作流模型ID在工作流模型庫中查找相應的過程定義,并利用XML綁定技術解析出其中的“活動”與“變動”信息,存入相應的流程定義表(該表存儲與活動相關的信息,其中起始活動必須進行標識)。解析是用某種方法在分析XML文檔的組成結構上采用兩種模型:線性模型(SAX模型)和樹模型(D0M模型)。SAX是針對XML的簡單API,采用基于事件的順序執(zhí)行機制;而DOM則提供了一種通過分層對象模型訪問XML文檔的信息,這正與XML的分層結構相吻合,給隨機訪問帶來了方便。在流程定義表中,由于從起始活動開始,在“變動”表中可以找到所有的后繼活動,因此可以遍歷所有活動,它相當于有向圖的一種表示方法。
(2)控制過程實例(創(chuàng)建,激活,流轉(zhuǎn),終止等):客戶端對流程的操作,基本上都可以分割為創(chuàng)建、激活、流轉(zhuǎn)和終止等幾個方面,針對這幾類操作,再加上一些輔助的信息,引擎調(diào)度器要求能夠?qū)⒁陨纤械牟僮鬓D(zhuǎn)換為對數(shù)據(jù)庫的邏輯操作。
(3)過程控制管理[3],它負責以下工作:初始化工作流引擎,生成工作流模型;啟動工作流引擎,從過程實例庫中讀取處于運行狀態(tài)的過程實例,與條件判定器交互獲取條件判定結果,并且生成過程實例,存儲在過程實例庫中;從事件處理庫中讀取事件處理方法,與條件判定器交互獲取條件判定結果,并且生成事件處理程序,存儲在事件處理庫中等。
(4)按照過程定義已確定的業(yè)務邏輯調(diào)用各項活動:在流程的每一步流轉(zhuǎn)的過程中,流程定義中可能還包含了很多額外的業(yè)務邏輯調(diào)用設定,比如特定的腳本、特定的附加組件等,在每一次的操作中一旦這些設定被激活,引擎調(diào)度器將要根據(jù)事先的設定,正確而又及時的調(diào)用這些邏輯活動。
引擎調(diào)度器的用例圖如圖2所示。
圖2 工作流引擎的引擎調(diào)度器用例圖
活動者包括工作流監(jiān)控端、工作流定義數(shù)據(jù)庫、工作流運行數(shù)據(jù)庫及組織機構數(shù)據(jù)庫。其中,工作流客戶端作為接受用戶交互的界面部分,將用戶所作的行為,按照固定的規(guī)則,通過其他模塊將請求交給引擎調(diào)度器。流程監(jiān)督者作為接收系統(tǒng)管理員交互的界面部分會對系統(tǒng)做出調(diào)整,然后發(fā)送給具體的處理模塊進行處理。其余的工作流定義數(shù)據(jù)庫等活動者,負責將引擎調(diào)度器每一步的操作與狀態(tài)記錄到數(shù)據(jù)庫中,以便永久保存。用例包括資源定位、引擎容器、定義裝載、流程監(jiān)督。其中,引擎容器通過資源定位系統(tǒng)所用到的資源表,引擎容器用例使用資源定位用例。引擎容器不直接與用戶交互,活動者對工作流的參與都是通過流程監(jiān)督這個工作流執(zhí)行模塊的入口來進行。引擎容器通過定義裝載將現(xiàn)有的工作流定義裝入,這樣才能運行該工作流,引擎容器用例與資源定位用例之間是使用關系。
根據(jù)以上引擎調(diào)度器用例的分析得出:所有的流程運轉(zhuǎn)都將在引擎調(diào)度器上進行,因此,引擎調(diào)度器應該有自己的狀態(tài),并且外界可以對該調(diào)度器進行操作?;谶@一點,此處將引擎調(diào)度器這個實體建模為WorkFlowIns類。由于引擎調(diào)度器需要根據(jù)不同的用例達到對各個流程實例的控制,因此添加WorkEngineCntrls類,表示引擎調(diào)度管理器。同時,由于工作流引擎中有許多類型的實體,如流程定義、流程實例、活動和相關數(shù)據(jù)等,根據(jù)面向?qū)ο蟮脑O計原則[6],將這些實體的操作封裝在這個實體內(nèi)部。在系統(tǒng)中,由于有多個WorkFlowDefine類和WorkFlowIns類的實例在運行,因此WorkEngineCntrls類與WorkFlowDefineCls等類的關系應該是一對多的關系,也就是關聯(lián)。在WorkFlowIns類中除了基本的工作流屬性標識id與名稱name,還需增加相應的對應工作流的url、初始狀態(tài)state、前一個狀態(tài)prestate、下一個狀態(tài)nextstate,主要方法包括設置工作流地址seturl()、獲取工作流地址geturl()以及工作流初始控制flowInsCtrol()。WorkContrl工作控制類是引擎調(diào)度器最重要的類之一,其中的4個方法主要應用在調(diào)度過程中。Data類是為了獲取相應的數(shù)據(jù)或設置數(shù)據(jù)。另外,由于引擎調(diào)度器在執(zhí)行時可能產(chǎn)生錯誤,為了將這些錯誤捕獲,設置了相應的異常類O-prationException。綜合以上分析,引擎調(diào)度器的類圖如圖3所示。
圖3 工作流引擎調(diào)度器的類圖
每次引擎調(diào)度器開始工作時,必須要先調(diào)用start()方法,使引擎調(diào)度器開始自動運行,引擎調(diào)度器的算法步驟為:
Step1.執(zhí)行引擎。注冊執(zhí)行引擎啟動時,通過EJB遠程調(diào)用主控引擎的引擎管理器,將自身注冊到主控引擎的主控狀態(tài)機上;
Step2.當主控引擎收到客戶啟動流程的請求后,引擎調(diào)用過程實例加載器,將需要啟動的流程定義加載到運行庫;然后由過程實例加載器調(diào)用過程定義解釋器,將XML流程定義轉(zhuǎn)化為Process流程定義對象。同時建立流程實例列表。
*加入第一個流程實例;
*依次加入流程實例;
*加入最后一個流程實例;
Step3.初始活動執(zhí)行。主控引擎調(diào)用活動執(zhí)行處理器,執(zhí)行流程的第一個初始活動;
*If(判斷流程實例列表為空)
then引擎等待或掛起
else得到第一個流程實例;
*If(當前實例=下一個實例)
then執(zhí)行完成,進入第3步。
else處理下一個流程實例。
Step4.發(fā)送狀態(tài)變更通知?;顒訄?zhí)行處理器執(zhí)行完畢后,將此活動作為參數(shù)調(diào)用引擎管理器的Notification()方法,發(fā)送已執(zhí)行的通知。
*檢測當前流程實例觸發(fā)條件是否達到,相關數(shù)據(jù)是否完備;
*按照當前流程實例處理描述,進行流程實例操作,如果操作成功則觸發(fā)目標,并傳送相關數(shù)據(jù);
*記錄相關日志信息;
*將相關數(shù)據(jù)信息、交互信息返回給用戶,并更改節(jié)點狀態(tài)和優(yōu)先級。
Step5.獲取后繼活動。引擎管理器根據(jù)已執(zhí)行活動取得其后繼活動及工作流相關數(shù)據(jù)并動態(tài)調(diào)度執(zhí)行引擎,執(zhí)行引擎的流實例列表;
Step6.主控狀態(tài)機給執(zhí)行引擎發(fā)送通知,主控狀態(tài)機監(jiān)聽到消息后,調(diào)用Changed()方法改變自身狀態(tài),調(diào)用NotifyObserver()方法,通知所有注冊的執(zhí)行引擎的觀察器,回調(diào)每個執(zhí)行引擎的update()方法;
Step7.執(zhí)行引擎執(zhí)行活動。如果執(zhí)行引擎的URL與參數(shù)中的URL一致,則執(zhí)行引擎的觀察器調(diào)用自身的活動處理器,執(zhí)行當前活動?;顒訄?zhí)行完畢,再調(diào)用引擎管理器的Notification()方法,再次循環(huán)執(zhí)行Step4~Step7,直到整個流程結束;
Step7.流程結束,整個流程執(zhí)行完畢,調(diào)用清除器清除相關的實例數(shù)據(jù)。
引擎調(diào)度器是工作流引擎的調(diào)度和處理入口,是工作流引擎中的核心部件。本文通過對工作流引擎調(diào)度器的體系結構、功能進行分析,給出了相應的用例圖、類圖以及調(diào)度算法。本文設計并開發(fā)的工作流引擎調(diào)度器,已經(jīng)應用到了某通信公司辦公自動化系統(tǒng)中,并取得了較好的應用效果。
[1]羅海濱,范玉順,吳澄.工作流綜述[J],軟件學報,2000,11,(7):899-907.
[2]劉鐵銘,范玉順.基于工作流管理方式的應用協(xié)作模塊分析與設計[J].計算機工程與應用,1999,35(2):56-62.
[3]范玉順.工作流管理技術基礎-實現(xiàn)企業(yè)經(jīng)營過程重組與經(jīng)營過程自動化的核心技術[M].北京:清華大學出版社,2001.
[4]史美林,楊光信等.一個基于Web的工作流管理系統(tǒng)[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-),女,湖南石門人,長沙民政職業(yè)技術學院軟件學院講師、碩士。研究方向:軟件工程與計算機應用;王平(1975-),女,湖南洪江人,長沙拓維有限公司助理工程師、碩士。研究方向:工作流技術。