工作流引擎设计之子流程功能实现
Posted AlexanderHu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了工作流引擎设计之子流程功能实现相关的知识,希望对你有一定的参考价值。
一个成熟的工作流管理系统,其引擎对于子流程功能的支持必然是不可少的,这好比是一门编程语言支持函数那么普遍一样。在当前Workflow, BPM, EAI产品的建模工具中,对于子流程/子过程的应用如家常便饭一样,无处不在——是的,随着流程建模工具的日益强大、企业业务过程的日趋复杂及集成要求的不断增长,把相似的“过程”封装成一个个可调用的过程“函数”已经是一个不可缺少的功能了。
下面的内容,主要就以在工作流引擎系统中子流程功能的设计展开。注意:这里父流程指的是主动调用的流程;子流程指的是被动被调用的流程;由XPDL作为建模示范。
建模设计——父流程中描述子流程的XPDL片段及解释
1、子流程(SubFlow)作为父流程中的一种特殊的活动出现。
2、子流程活动的执行(Implementation)节点描述了子流程的同步异步策略以及父流程向子流程提供的实际输入参数(实参)。
实参匹配规则:
如果实参与形参(子流程定义的参数)的数量和类型完全匹配,则不应用特殊规则
如果实参数量大于形参数量,则多出的实参按照前后顺序被忽略
如果实参数量小于形参数量,则引擎抛出“流程设计异常”,并明确提示用户
如果实参和与之对应的形参类型不匹配,则引擎“尝试”进行智能类型转换,如果无法转换(如String型“ok”转换为Boolean型),则引擎抛出“工作流转型异常”,并明确提示用户
子流程活动扩展属性(ExtendedAttributes)参见普通人工活动的扩展属性定义。
XPDL:
< WorkflowProcess AccessLevel ="PUBLIC" Id ="1028100100000000053" Name ="测试流程(主流程)" >
……
< Activities >
……
< Activity Id ="SubFlow1" Name ="子流程活动" >
< Implementation >
< SubFlow Id ="1028100100000000042" Execution ="SYNCHR" >
< ActualParameters >
< ActualParameter > rData </ ActualParameter >
< ActualParameter > mainXParam </ ActualParameter >
</ ActualParameters >
</ SubFlow >
</ Implementation >
< Description />
< Performer />
< TransitionRestrictions >
……
</ TransitionRestrictions >
< ExtendedAttributes >
< ExtendedAttribute Name ="AssignStrategic" Value ="All" />
< ExtendedAttribute Name ="ExecuteNode" Value ="" />
< ExtendedAttribute Name ="Limit" Value ="" />
< ExtendedAttribute Name ="OvertimeHandlerType" Value ="D" />
< ExtendedAttribute Name ="OvertimeHandlerTool" Value ="email" />
< ExtendedAttribute Name ="OvertimeHandlerRef" Value ="" />
< ExtendedAttribute Name ="CanRollback" Value ="false" />
< ExtendedAttribute Name ="CanWithdraw" Value ="" />
< ExtendedAttribute Name ="UnrestrictedRouting" Value ="false" />
< ExtendedAttribute Name ="ExecuteUnit" Value ="W" />
< ExtendedAttribute Name ="CommitStrategic" Value ="Anyone" />
< ExtendedAttribute Name ="ExecuteStrategic" Value ="Share" />
< ExtendedAttribute Name ="StartActivityAction" Value ="" />
< ExtendedAttribute Name ="EndActivityAction" Value ="" />
< ExtendedAttribute Name ="CommitStrategicPercentNumber" Value ="0" />
</ ExtendedAttributes >
</ Activity >
</ Activities >
建模设计——子流程中描述子流程的XPDL片段及解释
1、如果一个流程作为子流程,那么它可以定义自己的输入输出参数(形参)。
2、流程的参数节点(FormalParameters)可以包含多个形参(FormalParameter)。
3、形参的模式(Model)有:
IN,输入模式,形参接受实参的输入而不将值返回实参,即可以理解为实参只读
OUT,输出模式,子流程返回父流程时,实参获取形参的值,将子流程的数据输出到父流程;注意:如果父流程中定义子流程为异步执行,此模式仍然具有意义
INOUT,输入输出模式,同时具有IN和OUT模式的特性
4、形参的类型定义同工作流相关数据。
XPDL:
< WorkflowProcess AccessLevel ="PUBLIC" Id ="1028100100000000042" Name ="测试流程(子流程)" >
……
< FormalParameters >
< FormalParameter Id ="procParam1" Index ="2" Model ="INOUT" Name ="流程字符形参" >
< Description />
< Length />
< DataType >
< BasicType Type ="STRING" />
</ DataType >
< ExtendedAttributes />
</ FormalParameter >
< FormalParameter Id ="procParam2" Index ="3" Model ="IN" Name ="流程布尔形参" >
< Description />
< Length />
< DataType >
< BasicType Type ="BOOLEAN" />
</ DataType >
< ExtendedAttributes />
</ FormalParameter >
</ FormalParameters >
主子流程多版本并存问题的处理策略
流程定义被修改后会在内部产生新的版本,也就是说在引擎外每个流程定义都有唯一ID(对每个流程定义唯一,简称外部ID);而对引擎来说任何一个流程定义,都可能有未知数量的不同版本,每个版本的ID(对每个流程定义可能存在多个,简称内部ID)肯定是不同的。
本设计方案对此问题的处理策略:
1、父流程定义时引用子流程的外部ID。
2、父流程在实例化子流程时,利用子流程的外部ID获取子流程的当前版本ID(即最新版本的内部ID),实例化之,完成子流程的启动。
3、子流程的变更必然会影响新发起的父流程和已经发起但并没有启动子流程的父流程,反之,子流程的变更将无法影响到子流程已经启动的父流程。
4、子流程的形参变更可能会导致父流程运行错误(形参数量不匹配、形参类型不匹配等),所以,子流程形参变更后,需要检查父流程的定义。
5、以上两点,需要流程设计者注意——即在建模工具中提示流程设计者。
子流程活动的“退回”和“取回”策略
由于子流程活动的“退回”和“取回”操作涉及面大、较为复杂,本设计方案不讨论——即不支持。
子流程的流程发起者定义
如果子流程中出现参与者为流程发起者的情况,则此参与者为父流程的流程发起者,即子流程的流程发起者同父流程的流程发起者。
同步子流程的定义
父流程实例启动子流程活动后,同步等待子流程活动结束,接收子流程输出参数,然后再启动下一步活动。
异步子流程的定义
父流程实例启动子流程活动后,不等待子流程活动运行结束,立刻启动、运行下一步活动。
注意:如果父流程尚未结束,子流程输出参数仍然有效,子流程将会在某个不确定的时间(子流程结束)将参数值返回父流程。提示:利用此特性,可以完成一些异步条件等待的应用场景。
父流程的列表展现处理
针对流程管理节点及流程监控节点:
父流程在列表显示时,需要利用列明确标识含有子流程,同时利用隐藏域记录子流程ID。
增加功能“显示子流程”:选中父流程,展现其子流程列表,子流程列表具有同普通流程管理节点的功能操作。
子流程的列表展现处理
因为子流程可能被多个父流程嵌套引用,所以同普通流程列表的展现处理。
针对流程管理节点及流程监控节点无特殊处理。
在父流程监控中对子流程的处理
针对流程实例监控列表无特殊处理。
针对父流程的监视图:
如果子流程已经启动的话,在监视数据准备时将子流程实例ID装入图形的子流程节点;选中图形的子流程(已经启动)节点,可以打开某种模式窗体,展现此子流程实例的监控操作界面(为新界面或利用已有列表),在此界面可以对子流程实例进行“监”和“控”的操作。
即对子流程的监控,均在父流程的模式窗体中执行。
在子流程监控中对父流程的处理
针对流程实例监控列表。
需要利用列明确标识父流程实例的名称(可以隐藏展现其ID)。
针对子流程的监视图:
在监视数据准备时将父流程实例ID装入图形页面;增加功能“监控父流程”,可以打开某种模式窗体,展现此父流程实例的监控操作界面(为新界面或利用已有列表),在此界面可以对父流程实例进行“监”和“控”的操作。
即对父流程的监控,均在子流程的模式窗体中执行。
实例的清除规则
清除父流程实例时需要清除其子流程的实例。
清除子流程实例时需要询问是否清除其父流程的实例,告知可能造成的影响。
父子流程的完成和终止规则
父流程实例终止,其同步/异步子流程实例也会同时终止。
父流程实例完成,其同步子流程实例如何操作?思考一下:-)这种情况目前不会出现。
父流程实例完成,其异步子流程实例不受影响。
子流程实例执行终止操作:
同步子流程,父流程实例也应同时终止;
异步子流程,需要给与警告提示:如果子流程存在OUT/INOUT型参数……,父流程实例不受影响,继续进行;
子流程实例执行完成操作:
同步子流程,完成之,然后返回父流程实例,父流程实例继续进行;
异步子流程,完成之,父流程实例不受影响,继续进行(OUT/INOUT型参数需要被带回)。
——本文是在实现工作流引擎系统时的一些设计和指导原则,供大家参考。
以上是关于工作流引擎设计之子流程功能实现的主要内容,如果未能解决你的问题,请参考以下文章