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.toberp.com/
本文标题:基于连续语义的业务流程模型的转换
本文网址:http://www.toberp.com/html/consultation/10820510581.html