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