一个成熟的工作流管理系统,其引擎对于子流程功能的支持必然是不可少的,这好比是一门编程语言支持函数那么普遍一样。在当前Workflow, BPM, EAI产品的建模工具中,对于子流程/子过程的应用如家常便饭一样,无处不在——是的,随着流程建模工具的日益强大、企业业务过程的日趋复杂及集成要求的不断增长,把相似的“过程”封装成一个个可调用的过程“函数”已经是一个不可缺少的功能了。

下面的内容,主要就以在工作流引擎系统中子流程功能的设计展开。注意:这里父流程指的是主动调用的流程;子流程指的是被动被调用的流程;由XPDL作为建模示范。

建模设计——父流程中描述子流程的XPDL片段及解释

1、子流程(SubFlow)作为父流程中的一种特殊的活动出现。

2、子流程活动的执行(Implementation)节点描述了子流程的同步异步策略以及父流程向子流程提供的实际输入参数(实参)。

实参匹配规则:

    如果实参与形参(子流程定义的参数)的数量和类型完全匹配,则不应用特殊规则

如果实参数量大于形参数量,则多出的实参按照前后顺序被忽略

如果实参数量小于形参数量,则引擎抛出“流程设计异常”,并明确提示用户

如果实参和与之对应的形参类型不匹配,则引擎“尝试”进行智能类型转换,如果无法转换(如String型“ok”转换为Boolean型),则引擎抛出“工作流转型异常”,并明确提示用户

子流程活动扩展属性(ExtendedAttributes)参见普通人工活动的扩展属性定义。

XPDL:

< WorkflowProcesses >
< 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:

< WorkflowProcesses >
< 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型参数需要被带回)。

——本文是在实现工作流引擎系统时的一些设计和指导原则,供大家参考。

工作流引擎设计之子流程功能实现相关推荐

  1. 驰骋工作流引擎设计系列04 流程引擎表结构的设计

    第1节. 关键字 驰骋工作流引擎 流程快速开发平台 workflow ccflow jflow 第1节. 流程引擎表结构的设计 流程引擎表是流程引擎控制流程运转的数据存储表,是整个流程引擎的核心表.理 ...

  2. 工作流引擎Synchro Flow的流程度量

    2019独角兽企业重金招聘Python工程师标准>>> 度量基于联机分析处理(OLAP)的理念,具有灵活的流程分析功能.直观的数据操作和分析结果可视化表示等突出优点,从而使用户对基于 ...

  3. 开源驰骋工作流引擎设计ccflow已读回执设计

    为什么80%的码农都做不了架构师?>>>    驰骋工作流引擎设计ccflow已读回执 关键字:工作流引擎 已读回执 CCFlow 工作流程引擎已读回执 开源工作流引擎 工作流引擎已 ...

  4. 常用的Java流程引擎API开发调用接口大全-工作流引擎设计

    关键词: 工作流引擎 BPM系统 接口调用 工作流快速开发平台  工作流流设计  业务流程管理   asp.net 开源工作流 一.程序调用开发接口  二.   接口说明 所谓的驰骋工作流引擎的接口, ...

  5. 驰骋工作流引擎设计系列07 线性流程节点运动(发送)设计

    第1节. 关键字 驰骋工作流引擎 流程快速开发平台 workflow ccflow jflow 第1节. 线性流程节点运动(发送)设计 发送就是从一个节点发送到另外一个节点,也可以说从一个节点运动到另 ...

  6. 驰骋工作流引擎设计系列05 启动流程设计

    2019独角兽企业重金招聘Python工程师标准>>> 启动流程设计 第1节. 关键字 驰骋工作流引擎 流程快速开发平台 workflow ccflow jflow 第1节. 启动流 ...

  7. 我的微型工作流引擎设计

    一.前言 提到工作流很多人就会想到OA,的确OA就是典型的工作流的应用,但是工作流并不仅仅局限于OA,工作流应该算是基础框架软件,主要用于流程的重组和优化,它有广阔的应用领域.在java下有很多优秀的 ...

  8. 工作流引擎设计之退回任务定义

    退回(Rollback Work Item) 退回是针对本人(工作流参与者)的"待办任务"的操作,即参与者主动退回待办任务列表中的任务. 为什么要退回? 参与者接受任务后,发现不应 ...

  9. 可扩展的工作流引擎设计

    一. 前言 一提到"流程",各位看官就山呼海啸--神啊救救我吧:报销流程太慢了.流程五花八门.流程太不智能了等等."工作流引擎"就是来解决这些问题的! 小生近日 ...

最新文章

  1. jgit 查看当前分支_分支 (branch)
  2. python常见问题
  3. 服务器配置和性能,服务器性能配置(硬件)
  4. 【HDU - 1757】A Simple Math Problem (矩阵快速幂)
  5. 《Flask 入门教程》 第 2 章:Hello, Flask!
  6. html图片上传阅览并且点击放大
  7. 荣获2009年“微软最有影响力开发者”称号
  8. 201506170744_《JavaScript权威指南(第六版)——函数调用变长实参和可选形参、》(P171-175)...
  9. sprint tool suite启动tomcat
  10. win7本地登录计算机,win7系统绑定微软账户到本地电脑上的具体办法
  11. Springboot访问静态页面
  12. PS怎么用3D功能怎么用?如何用PS做立体字
  13. tomcat启动成功并能运行项目,但无法显示那只小猫
  14. 公开课分享《如何快速有效地编写一份商业计划书》
  15. EXPLAIN 使用
  16. 查看自己电脑应用对应的端口号
  17. 查询网卡MAC地址.bat
  18. 互联网:互联网进入下半场,这场赛怎么比?
  19. 6.4 深度负反馈放大电路放大倍数的分析
  20. 从站寄存器EEPROM内容解析之SII(Slave Information Interface)

热门文章

  1. 迅雷无限节点CDN模式颠覆传统
  2. python 写命令行界面_使用Python进行命令行界面编程?
  3. vue2安装插件失败方法
  4. origin绘制曲线局部放大图
  5. 如何做到低延迟OTT视频直播
  6. IDEA中使用GsonFormat插件
  7. 跟我一起使用 compose 做一个跨平台的黑白棋游戏(2)界面布局
  8. java开闭原则是什么?
  9. 区块链技术赋能音乐作品版权保护 法院采信存证证书作为有效权属证据
  10. 通达信level2接口代码是什么