摘要:工作流管理技術(shù)是一種過程建模和過程管理的核心技術(shù),它可以應(yīng)用在很多業(yè)務(wù)管理系統(tǒng)中。本文介紹了工作流的概念、建模方法、模型驗證方法和Bossa開源引擎,描述工作流管理系統(tǒng)從建模到實現(xiàn)的具體方法。
關(guān)鍵詞:工作流;Petri網(wǎng);工作流模型;Bossa
1 引言
傳統(tǒng)的信息管理系統(tǒng)多以數(shù)據(jù)處理為中心,通過提高個人效率來高效地完成任務(wù)。而對于需要多人或多部門協(xié)作完成的工作缺乏過程控制。工作流正是通過提高集體協(xié)作效率來加速完成具體工作。它以業(yè)務(wù)過程為中心,對過程進行密切監(jiān)控,不僅僅對過程中的單個活動提供支持,而且對活動之間的關(guān)系也提供自動或半自動的支持。采用工作流技術(shù),可以把業(yè)務(wù)活動中按照功能配置的組織結(jié)構(gòu)轉(zhuǎn)變成按照要實現(xiàn)的工作流程來配置組織結(jié)構(gòu),這樣可以大大提高工作效率。
2 基于Petri網(wǎng)的工作流建模方法
Petri網(wǎng)是一種圖形化、數(shù)學(xué)化的建模工具。Petri網(wǎng)自上世紀六十年代由德國學(xué)者C.A.Petri提出以來,經(jīng)過了四十余年的發(fā)展,已被廣泛地應(yīng)用于各個領(lǐng)域進行系統(tǒng)建模、分析和控制。
Petri網(wǎng)特別適合描述和研究具有并行、異步、分布式和隨機性等特征的復(fù)雜系統(tǒng)。作為一種圖形化工具,Petri網(wǎng)可以看作和流程圖一樣進行系統(tǒng)描述的工具;而作為一種數(shù)學(xué)化的工具,Petri網(wǎng)可以用來建立狀態(tài)方程、代數(shù)方程和其他描述系統(tǒng)行為的數(shù)學(xué)模型,用于對系統(tǒng)的可靠性、一致性、完整性等進行分析。
工作流網(wǎng)是在Petri網(wǎng)的基礎(chǔ)上提出的,可以說是Petri網(wǎng)的一種應(yīng)用,其定義如下:
一個Petri網(wǎng)PN=(P,T,F(xiàn))被稱為工作流網(wǎng),當且僅當它滿足下面兩個條件——
(1)PN有兩個特殊的庫所:i和o。庫所i是一個起始庫所,即·i=φ;庫所o是一個終止庫所,即o=φ。
(2)如果在PN中加入一個新的變遷t*,使t*連接庫所i與o,即t*={o},t*={i},這時得到的PN是強連接的。
注:工作流網(wǎng)PN=(P,T,F(xiàn))中,P是庫所的集合,T是變遷(活動)的集合,F(xiàn)表示庫所到變遷或變遷到庫所弧的集合。
在利用Petri網(wǎng)建立工作流模型中,我們常常會用到一些基本結(jié)構(gòu),它們分別是串行(順序)、并行、條件選擇、循環(huán)、通訊、資源共享等結(jié)構(gòu)模型,下圖圓表示庫所、矩形表示變遷,而黑色圓點為托肯。
工作流網(wǎng)組件的分析中看出一個變遷觸發(fā)的前提是變遷的直接前驅(qū)庫所存在托肯,然而變遷的真正執(zhí)行除了這種前提條件之外,還需要具備相應(yīng)的觸發(fā)機制。它是使?jié)M足執(zhí)行前提的變遷真正進入執(zhí)行狀態(tài)的外部條件,而這種用于觸發(fā)活動執(zhí)行的外部條件可分成四種,分別是自動觸發(fā)、人工觸發(fā)、消息觸發(fā)和時間觸發(fā)。在建模中具有這四種觸發(fā)條件的活動圖形表示如圖。
3 工作流模型驗證
應(yīng)用Petri網(wǎng)的分析技術(shù)對工作流模型進行驗證的目的是在過程設(shè)計中檢驗工作流的正確性,避免執(zhí)行時出現(xiàn)異常,過程異常包括死鎖、死任務(wù)和活鎖等。工作流建模是開發(fā)工作流管理系統(tǒng)的先行任務(wù),所以在工作流投入使用之前就要進行很好的分析驗證。如果一個工作流過程定義模型在其正確性、合理性沒有得到充分驗證時就投入使用,在工作流管理系統(tǒng)運行后再去進行修改,代價將遠遠高于前期的修改。因此在工作流模型實際實施之前,對其進行合理性分析,探索其中可能存在的各種過程異常,可以大大降低工作流運行時停產(chǎn)、檢查和修復(fù)的成本,具有重大的意義。
工作流網(wǎng)的合理性定義是:
一個工作流網(wǎng)PN=(P,T,F(xiàn))建模的過程是合理的,當且僅當滿足下面的三個條件——
(1)對于每一個狀態(tài)i可達的狀態(tài)M,存在一個實施序列,從狀態(tài)M肘通往狀態(tài)o,形式化表示為: ;
(2)狀態(tài)o是從狀態(tài)i可達的唯一最終狀態(tài),且結(jié)束時其中至少會有一個標記,形式化表示為: ;
(3)在(PN,i)中沒有死變遷(不可能執(zhí)行到的變遷),形式化表示為:,。
其中條件一是規(guī)定了從初始庫所總能到達終止庫所;第二個條件規(guī)定了當托肯轉(zhuǎn)移到終止庫所時,其他所有庫所都要是空的,也就意味這整個工作流的結(jié)束;第三個條件是規(guī)定不能有死變遷,即所有的變遷都能得到執(zhí)行。
在研究分析各種文獻的工作流網(wǎng)的合理性驗證理論和方法的基礎(chǔ)上,對原有的算法進行綜合改編,使算法更容易理解,總結(jié)出合理性算法的基本思路和驗證步驟。
算法的基本思路是:根據(jù)工作流網(wǎng)模型建立矩陣,用矩陣表示每個變遷的前后順序;根據(jù)模型表示出每個變遷的前后庫所,用來確定托肯轉(zhuǎn)移時的向量表示規(guī)則;從初始庫所出發(fā),根據(jù)變遷的前后庫所和矩陣判斷后續(xù)觸發(fā)的活動,并重復(fù)此工作,直到?jīng)]有變遷可以發(fā)生;如果終狀態(tài)是形如(0,0,…,1)的終止狀態(tài)(此時托肯存放在最后一個庫所,其余所有庫所中都沒有托肯存在),并且所有的變遷都觸發(fā)過,托肯也經(jīng)歷了所有的庫所,這時可以說改模型是合理的、正確的,否則模型中就存在錯誤。
在算法中要描述出狀態(tài)從(1,0,0,…)到狀態(tài)(0,0,…,1)的推算過程,并且要用另一個集合表示所執(zhí)行的活動,最終檢查是否合理的依據(jù)就是a)狀態(tài)向量是否變成(0,0,…,1);b)表示變遷的集合是否包含所有的活動。算法的具體描述為:
(1)用矩陣表示各個變遷之間的前后順序,方法如下:
(2)根據(jù)矩陣構(gòu)造各個變遷的輸入庫所集合和輸出庫所集合,用t表示變遷t的輸入庫所集合,用t表示變遷t的輸出庫所集合。構(gòu)造方法是,矩陣t列中所有為1的元素的行號的前驅(qū)庫所即t的輸出庫所集合;t行中所有為1的元素的列標的前驅(qū)庫所即t的輸入庫所集合;沒有前驅(qū)變遷的變遷的輸入庫所集合為起始庫所i,沒有后續(xù)變遷的變遷的輸出庫所集合為終止庫所o。
(3)構(gòu)造初始條件,初始條件有一個向量和一個集合,向量P0=(1,0,0,…),具體向量的維數(shù)是庫所的個數(shù),表示托肯在第一個庫所內(nèi);集合T0為空,表示沒有執(zhí)行任何變遷。
(4)根據(jù)變遷t的輸入庫所集合t和輸出庫所集合t,更改向量P,并把活動t添加到集合T中,并根據(jù)矩陣判斷下一個活動。
(5)反復(fù)進行執(zhí)行步驟(4),直到?jīng)]有變遷可以執(zhí)行且執(zhí)行一遍所有活動。
通過矩陣列舉出活動序列,說明所有的活動都處于起始庫所和終止庫所之間,滿足了合理性條件一;由于在列舉活動序列時,序列中包含了所有活動,說明沒有活動是死活動,滿足了合理性條件三;演算的結(jié)果中向量P={0,0,0,0,0,0,0,0,0,1},證明在工作流結(jié)束時,托肯只存在于終止庫所中,其他所有的庫所中均不存在托肯,滿足了合理性條件二。通過以上演算,可以證明模型能否滿足合理性定義中的三個條件,若能夠滿足條件,可以得出結(jié)論,工作流模型是正確、合理的。
4 工作流管理系統(tǒng)開發(fā)
Bigbross Bossa是一種速度非常快、輕量級的工作流引擎,使用簡單,能方便和Java應(yīng)用集成。Bossa提供了強大的類庫,能實現(xiàn)工作流系統(tǒng)所要求的各種功能。之所以選擇Bossa,主要是因為它具有以下特點:
(1)Bossa本身是通過java開發(fā),可以很方便的和java應(yīng)用集成。筆者開發(fā)的工作流系統(tǒng)是通過java技術(shù)實現(xiàn)的,所以在選擇工作流引擎時要充分考慮引擎本身是否由java語言開發(fā)的。
(2)Bossa是開源的,對于在Bossa上定義的類,可以看到其源代碼,并可以根據(jù)需要對其進行修改。
(3)Bossa是各種工作流引擎中為數(shù)不多的采用Petri網(wǎng)來定義工作流的引擎之一。由于在建模時采用了Petri網(wǎng),所以要選擇能完全支持用Petri網(wǎng)定義的工作流模型的引擎。
(4)Bossa本身不是一個成熟的系統(tǒng),它定義了各種供用戶使用的類,用戶可以在開發(fā)系統(tǒng)過程中引用這些類,在通過調(diào)用類的方法來實現(xiàn)對工作流的定義和操作。所以基于Bossa的二次開發(fā)算不上是對Bossa的改裝,而是在自己的系統(tǒng)中引用Bossa,這樣就有很大的自主性。
Bossa工作流引擎的基本使用方法如下:
(1)建立一個Bossa引擎
方法一:建立一個默認的Bossa工作流引擎
Bossa bossa = BossaFactory.defaultBossa();
方法二:建立一個特定的Bossa工作流引擎
BossaFactory factory = new BossaFactory();
factory.setStateDir(\"/var/lib/bossa\");
Bossa bossa = factory.createBossa();
其中/var/lib/bossa是引擎狀態(tài)的保存位置。
(2)對工作流模型進行描述
CaseType caseType = new CaseType (\"TestCaseType\");
//以上語句是聲明一個工作流模型
Place palceName = caseType.registerPlace(\"A\", 1);
//以上語句是在模型中聲明庫所,第二個參數(shù)表示托肯是否存在于庫所中。
Transition a = caseType.registerTransition(\"a\", \"requesters\");
//以上語句是聲明了變遷a,兩個參數(shù)分別定義了它的名稱和說明。
a.input(A,\"1\");
a.output(B,\"1\");
//定義了變遷a和庫所的關(guān)系,通過變遷的input()方法定義前驅(qū)庫所,變遷的output()定義活動的后繼庫所,并在選擇結(jié)構(gòu)中定義條件,根據(jù)條件決定把托肯送入哪個庫所。
HashMap attributes = new HashMap();
attributes.put(\"SOK\", new Boolean(1));
attributes.put(\"DIR\", new Boolean(1));
attributes.put(\"ADIR\", \"\");
attributes.put(\"OK\", new Boolean(1));
//對條件進行初始化
caseType.buildTemplate(attributes);
//建立此模型
通過對模型的描述,不難看出,Bossa正是一種基于Petri網(wǎng)的工作流引擎,它對工作流模型的和描述和Petri網(wǎng)的理論是非常吻合的,正是Bossa引擎的存在,才使基于Petri網(wǎng)的工作流模型真正的得以應(yīng)用和實現(xiàn)。
(3)對模型進行注冊
CaseTypeManager caseTypeManager = bossa.getCaseTypeManager();
caseTypeManager.registerCaseType(caseType);
第二個語句中的參數(shù)就是聲明的工作流模型
(4)工作的開始和結(jié)束
Activity activity = workItem.open(resource);//開始執(zhí)行
activity.cancel();//執(zhí)行完畢
5 結(jié)語
本文從工作流的概念開發(fā),介紹了利用Petri網(wǎng)對工作流進行建模和對模型進行分析和驗證的方法,并介紹了如何通過Bossa引擎實現(xiàn)工作流系統(tǒng)。由于工作流技術(shù)的應(yīng)用日益廣泛,該方法可以用于各種工作流系統(tǒng)的設(shè)計和開發(fā)。
參考文獻
[1]郝文,王道平.基于Petri網(wǎng)的工作流建模合理性驗證算法,計算機工程與應(yīng)用,2008,44(13).
[2]van der Aalst W M P. The application of Petri nets to Workflow Management[J].The Journal of Circuits,Systems,and Computers,1998,8(1) .
[3]袁崇義.Petri網(wǎng)原理,電子工業(yè)出版社[M]. 1998.
[4]李嶒.基于Petri網(wǎng)的工作流模型應(yīng)用研究,安徽大學(xué)碩士論文.2008,28~29.
[5]王瑜,李嶒. 基于Petri網(wǎng)的工作流模型合理性驗證,電腦知識與技術(shù).2010.(4)
[6]龐善臣.petri網(wǎng)在工作流系統(tǒng)建模和分析中的應(yīng)用,系統(tǒng)仿真學(xué)報,2005,vol.17.