0 引言
業務流程管理(Business Process Management,BPM)目前成為軟件分析師在分析企業目標和信息溝通的重要工具,近年來更是廣泛地用于企業應用集成(EntERPrise Application Integration,EAI)以及面向服務的體系結構(Service Oriented Architecture,SOA)中,從而衍生出相關過程語言的標準,作為模型在溝通及分析時的交換依據。業務流程建模符號(Business Process Modeling Notation,BPMN)是當前諸多基于模型驅動的流程開發軟件所使用的用標準圖形來描述業務流程的重要標準。BPMN定義了一組建模符號,將這一組建模符號依照一定的邏輯連接起來,就可以完成業務流程的建模。BPMN建模直觀,易于理解且與平臺無關。業務處理執行語言(Business Process Execution Language,BPEL)是一種用XML描述業務流程的語言,當前許多流程引擎都支持BPEL流程的自動執行,但是BPEL流程冗長、抽象,不適合業務流程分析師對業務流程的分析和設計。從而,更具體直觀的流程建模工具得到越來越多的人的青睞,比如:UML圖和BPMN圖。因此,需要一套映射規則,使得BPMN可以轉化為BPEL。
隨著新的BPMN標準的提出,以及業務流程模型復雜性的增加,按照一定的映射規則轉化成的BPEL更是千差萬別。當前提出的BPMN到BPEL的映射主要有:基于塊結構的轉化方法和以圖形結構為基礎的轉化方法。Jane Koehler和Rainer所著的《Untangling Unstructured Cyclic Flows-A Solution Based on Continuations》在以上兩種主要映射規則的基礎上,介紹了事件--條件--動作(Event--Condition--Action,ECA)映射準則。通過使用<onEvent>捕獲流程中的每一個活動,得到的BPEL過于繁瑣。鑒于BPEL中對結構活動的支持,OUYANG.C等所著的《Translating BPMN to BPEL》在ECA映射方法的基礎上,提出基于“結構元”的映射方法。將BPMN流程圖看成是由序列結構元、排他結構元、重復結構元、并行結構元、循環結構元、異常結構元、復雜結構元和互循環結構元這八種結構元的嵌套和組合。每一種“結構元”都對應一定的BPMN塊結構。但文獻并沒有對含有多網關的任意循環的復雜結構元的映射提供有效的方法。
綜合以上映射方法,發現都存在以下缺點:1)完善性。即在BPMN及BPEL循環中,對于任意的良構的BPMN模型,是否都能準確地映射。2)自動性。所有的代碼是否都能自動生成而不需要人為地添加和修改。本文主要針對含有復雜結構循環的BPMN流程圖,對基于連續語義的映射算法進行優化和完善。
1 BPMN流程模型向BPEL的轉換
BPMN業務流程模型在現實的應用中干變萬化,不可能一一對其進行分析,解決映射問題的根本是研究組成這些業務流程模型的基本元素。Van der Aalst、Bartosz Kiepuszewaki等依據Petri網原理總結了21種工作流元素,這些元素能夠全面地對業務流程模型進行描述。這21種工作流模式中,包含5種基本控制元素:順序(Sequence)、平行拆分(Parallel Split)、單合并(Single Merge)、排他選擇(Exclusive Choice)、平行合并(Synchronize Merge)。圖1羅列了這五種基本控制元素。
圖1 5種基本控制元素
幾乎所有的BPMN業務流程模型都可以簡化成由以上5種基本工作流元素嵌套而成。為了接下來描述的方便,選擇BPMN 2.0元模型的一個子集來作為接下來工作的基礎。
1.1 基于連續語義的流程建模
為了將含有非結構循環的業務流程轉化為只支持含有單進單出結構循環的BPEL,可以為流程賦以連續語義。將流程模型表達的邏輯看成事件/狀態的組合,將流程當前的狀態稱為“現態”。“連續”是指流程當前狀態下的“次態”。John C.Reynolds所著的《Theories of programming languages》指出,實現連續語義的關鍵在于依照程序中指令的“動作”,為每條指令賦予一個函數,且這一組函數的最終執行結果應當和整個程序的執行結果一致。然后,為程序的每一個中間狀態賦予一個額外的參數,所有函數都是以這些參數為變量的。本文將這些參數稱為“連續參數”。“連續參數”的作用在于記錄程序從“現態”出發,在執行完一條指令的“動作”后,程序進入“次態”的過程。
連續語義將流程邏輯歸納為四要素:“現態”、“條件”、“動作”和“次態”,目的是方便我們在規避流程中單個活動節點的具體執行過程的前提下,描述當前流程的邏輯。具體描述方法如下:1)為含有多于一個出度或者入度的節點賦以“連續參數”,記為Yi;2)為每一個活動節點賦以一個函數,用于描述當前節點的“現態”、“動作”、“條件”和“次態”,如圖2。
圖2 兩種流程模型
1.2 轉化方法
1)替代原則:用于減少變量和等式的個數。
Y0=invoke A;Y1
Y1=if(expLl) then Y2;
if(expL2) then Y3;
等價于:
Y0=invoke A;
if(expLl) then Y2;
if(expL2) then Y3;
2)因數分解原則:適用于等式右邊包含有多個if分支,且每分支的最后都包含有相同的連續變量Yi。將這些相同的連續變量合并成一個,并添加一個新的BOOL值來消除重復的變量。
情況1:
Y1=invoke A;
if(expL1) then invoke B;Y2
{if(expL2) then Y2;}
endif
等價于:
Y1=invoke A;
if(expL1) then invoke B;
Pred:=(expLl)∨(¬(expL1)∧(expL2));
if Pred then Y2;
情況2:
Y1=if(expL1) then invoke A;
{if(expL2) then Y2;}
endif
if(expL3) then Y2;
等價于:
Y1=if(expLl) then invoke A;
Pred:=(expL3∨((expLl)∧(expL2));
if Pred then Y2;
3)參數消除原則:用于循環的消除。當有相同的連續變量同時出現在等式的左右兩側時,出現在等式右邊的Yi用repeat-while來取代,而取代的范圍則是從等號右邊開始一直到Yi的出現。
Y1=invoke A;
if(expL) then invoke C;
if(expL1) then Y2;
if(expL2) then invoke B;Y1
等價于:
Y1=repeat
{invoke A;
if(expL)then invoke C;
if(expL2)then invoke B;}
while(expL2);
if(expL1)then Y2;
4)if消除原則:將網狀分支進行重寫,使之成為順序執行的分支。
Y1=if(expL1) then Y2;
if(expL2) then Y3;
if(expL3) then Y4;
等價于:
Y1=if(expLl) then Y2;
if(expL2∧expL1) then Y3;
if(expL3∧expL1) then Y4;
1.3 轉化方法的使用與控制
1.2節中描述的四個轉化方法的優先級依次下降。流程引擎將按照如下步驟判斷如何選擇合適的轉化方法:
1)記連續參數的個數為k。建立一張數據表,記錄函數集合中每一個“連續參數”在等式右邊出現的次數,分別記為N1,N2,…,Nk(忽略Ni=0的參數)。
2)對所有Ni=1的參數使用“替代原則”。并重復1)。
3)執行完2)之后,若不再存在Ni=1的參數,依照轉化規則的優先級,依次判斷“因數分解原則”、“消除參數原則”、“if消除原則”中的某一個是否可以適用于等式。轉化完成后,依照1)、2)、3)的順序重復計算,直至N1=N2=…=Nk=0。
4)在所有“連續參數”出現次數均為零后,對得到的程序進行簡化:先找出流程中的“同義”節點。“同義”節點是指無論流程如何流轉,都必將執行的節點。同義節點包含以下兩種節點:1)“開始”和“結束”節點是每個流程必然要執行的節點,所以可以從流程中去除;2)存在中間節點Yi,若Yi屬于“同義”節點,那么對于任意的中間節點Yk,有YkYi恒為真,從而可以消去YkYi。
2 案例分析
本章通過一個案例分析說明一個流程的執行過程,并通過本文第l章闡述的映射方法,詳述BPMN模型到BPEL的映射過程。
圖3給出的是一個電子商務的購物過程。當流程開始執行時,首先執行活動(A)“選擇商品”。當活動(A)執行完畢,顧客可以選擇確認購買當前選中的商品,也可以選擇跳過商品的確認直接進入購物車,繼續選擇商品。流程引擎根據顧客的選擇,選擇執行活動(B)“確認商品”或執行活動(C)“入購物車”。接著,當之前的任意一條分支執行完成,流程將繼續執行活動(D)“提交訂單”,直到最后購物結束。當然,一個完善的流程必須允許客戶在購買的任意一個環節中都可以自由地跳出此環節,回退或者前進到流程中的其他環節。比如:當顧客準備提交訂單時,可能想要會退到購買環節重新選擇商品;又如:一個顧客可能想在提交訂單之前選擇多個商品,那么流程也應該允許回退到“選擇商品”的環節。
圖3 網絡購物流程
因為流程的復雜性、任意性,非結構化的循環在一個流程中出現的幾率是非常大的。非結構循環的特點即為含有超過一個入口或者出口的節點。比如,包含ABCD的循環,該循環中節點A可以由Start、節點E或節點F觸發。相對于非結構循環,結構循環的最大特點即為僅僅含有一個入口且僅有一個出口。我們將以上流程簡化,并為節點賦予連續參數:Y1,Y2,…,Y8,如圖4。
圖4 含有連續參數的網絡購物流程
為每一個活動添加函數。具體見如下8個等式:
(1)Y1=Start;Y2;
(2)Y2=invoke A;Y3;
(3)Y3=if AB then Y4;
if AC then Y5;
(4)Y4=invoke B;Y5;
(5)Y5=invoke C;Y6;
(6)Y6=if CD then invoke D;Y7
endif;
if CEnd then Y8;
if CA then Y2;
if CB then Y4:
(7)Y7=if DB then Y4;
if DA then Y2:
if DEnd then Y8;
(8)Y8=End;
接下來,依照1.2節給出的轉化方法,對圖進行轉化,具體步驟如下:
a)在流程引擎選擇某一個轉化規則之前,為流程中的“連續參數”建立一張數據表,記錄每一個“連續參數”在等式右邊出現的次數,如表1。
表1 步驟a)后連續參數次數
b)記錄所有“連續參數”出現次數(0次除外)。對僅僅出現一次的“連續參數”使用“替代原則”,用于減少等式集中等式的數量。在本例中,使用“替代原則”,等式(2)中的Y3用等式(3)替代,等式(5)中的Y6用等式(6)替代,等式(6)中的Y7用等式(7)替代,得到新的等式(2)和(5):
(2)Y2=invoke A;
if AB then Y4:
if AC then Y5;
(5)Y5=invoke C;;
if CD then invoke D;
{ if DB then Y4;
if DA then Y2;
if DEnd then Y8;}
endif;
if CEnd then Y8;
if CA then Y2:
if CB then Y4;
c)步驟b)完成之后,對“連續參數”的出現次數重新統計,如表2。
表2 步驟b)后連續參數次數
發現表2中沒有出現次數為1的“將來參數”。從而由優先級關系,看是否能利用“因數分解”原則。發現Y2、Y4、Y8三個參數同時在等式(5)的右邊出現兩次,則對等式(5)采用“因數分解”原則,得到新的等式(5):
(5)Y5=invoke C;
if CD then invoke D;
if(CD∧DB)∨CB then Y4;
if(CD∧DA)∨CA then Y2;
if(CD∧DEnd)∨CEnd then End;
d)完成步驟c)后,對“連續參數”的出現次數重新統計,如表3。
表3 步驟c)后連續參數次數
發現Y8出現的次數為1次,從而對Y8使用替代原則。發現此時Y2、Y4、Y5三個參數出現的次數同為2次,且均沒有出現在同一個等式的右邊。由最小化原則,最小化“invoke”活動出現的次數:也可以選擇對“if”網關進行最小化處理。但是考慮到若能減少“invoke”活動出現的次數,就能相對減少流程對Web Service的調用操作,從而可以減少工作流代碼量。對Y2、Y4、Y5三個變量進行觀察可以發現,有Y4=invoke B;Y5。從而對Y4使用“替換原則”,將其代入等式(2)和(5):
(2)Y2=invoke A;
if AB then invoke B;Y5
if AC then Y5;
(5)Y5=invoke C;
if CD then invoke D:
if(CD∧DB)∨CB then invoke B;Y5
if(CD∧DA)∨CA then Y2;
if(CD∧DEnd)∨CEnd then End;
e)完成步驟d)后,對“連續參數”的出現次數重新統計,如表4。
表4 步驟d)后連續參數次數
此時無法使用“替換原則”,從而考察“因數分解原則”,發現此原則可以在等式(2)中使用。進而考察“參數消除原則”。可以發現,等式(5)的兩邊同時出現了變量Y5。從而對等式(5)使用“參數消除原則”,并對Y5使用“替代原則”。
(2)Y2=invoke A;
if AB then invoke B:
if AC∨AB then
{ repeat
{ invoke C;
if CD then invoke D:
if(CD∧DB)∨CB then invoke B;}
while(CD∧DB)∨CB;
if(CD∧DA)∨CA then Y2;
if(CD∧DEnd)∨CEnd then End;}
endif
f)步驟e)完成后,對“連續參數”的出現次數重新統計,如表5。
表5 步驟e)后連續參數次數
此時發現變量Y2同時出現在等式(2)的兩邊,對等式(2)采用“消除參數原則”,并對變量Y2使用“替換原則”,并簡化流程:可以看到節點C是“同義”節點,從而AC可以被刪去。同理,Start與End均可以忽略。得到化簡后的結果為:
(1)Y1=repeat
{ invoke A;
if AB then invoke B;
{ repeat
invoke C;
if CD then invoke D:
if(CD∧DB)∨CB then invoke B;
while(CD∧DB)∨CB;}
endif}
while(CA∨(CD∧DA));
映射到BPEL:
<process name=" ">
<sequence>
<repeatUntil>
<sequence>
<invoke name="A"/>
<if>
<condition>AB</condition>
<invoke name="B">
</if>
<repeatUntil>
<sequence>
<invoke name=?C1/>
<if>
<condition>CD</condition>
<invoke name="D"/>
<elseif>
<condition>(CD&DB) or CB</condition>
<invoke name="B">
</elself>
<condition>(not((CD&DB) or CB)))
</condition>
</sequnce>
</repeatUntil>
<condition>(not((CA or (CD&DA)))</condition>
</sequnee>
</repeatUntil>
</sequence>
</process>
3 結語
由于業務流程模型和執行代碼在語義上的失配,以及業務流程模型的復雜性,業務流程模型到可執行的工作流代碼的轉換成為了業務流程建模的重要研究課題之一。本文在已有的模型轉化方法的基礎之上,面向BPEL 2.0規范,將基于連續語義的轉化方法進行了擴充和改進,并用形式化的方法對基于連續語義的轉化方法進行了描述。轉化的過程大體可以概括為流程表達的邏輯建模,照轉化規則化簡流程邏輯模型,將化簡后流程邏輯模型轉化為BPEL。依照這三個步驟,解決了含有非結構循環的復雜流程模型的映射問題。本文僅從理論角度討論了的業務流程模型一個子集的執行及轉化過程,如何實現轉化規則在流程引擎中的應用是接下來研究的重點。
轉載請注明出處:拓步ERP資訊網http://www.guhuozai8.cn/
本文標題:基于連續語義的業務流程模型的轉換
本文網址:http://www.guhuozai8.cn/html/consultation/10820510581.html