说说 jBPM 流程定义语言(5)—— fork - join (分支、聚合活动)
2018-02-07 10:52
711 查看
当我们需要流程并发(concurrency)执行时,就需要使用到 fork-join 活动组合,fork活动可以使流程在一条主干上出现并行的分支,join 活动则可以使流程的并行分支聚合成一条主干。
Fork 活动具有1个 name 属性和 n 个流出转移元素。
join 活动的独特属性:
![](http://upload-images.jianshu.io/upload_images/3386108-ef0f8fd284776b81.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
流程定义文件:
测试代码:
Fork 活动具有1个 name 属性和 n 个流出转移元素。
join 活动的独特属性:
属性 | 类型 | 默认值 | 是否必需 | 描述 |
---|---|---|---|---|
multiplicity | integer | 流入转移数 | 可选 | 流程执行中,当指定的流入转移数量(multiplicity)到达 join 活动后,流程即会聚合,沿着 join 活动的唯一流出转移继续执行流转。其他未到达的流入转移则会忽略,从而实现按流入转移数量聚合的场景,因此,multiplicity 属性不应该大于 join 活动定义流入转移数量。 |
lockmode | 字符串枚举:none、read、upgrade、upgrade_nowait、wirte | upgrade | 可选 | 指定 hibernate 的数据锁模式。因为 join 活动支持并发自动活动事务,因此需要在 join 活动上防止两个还没有聚合的同步事务活动互相锁定对象的事务资源,从而导致死锁。 |
![](http://upload-images.jianshu.io/upload_images/3386108-ef0f8fd284776b81.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
流程定义文件:
<?xml version="1.0" encoding="UTF-8"?> <process key="ConcurrencyGraphBased" name="ConcurrencyGraphBased" xmlns="http://jbpm.org/4.4/jpdl"> <start g="23,212,174,52" name="start1"> <transition to="fork1"/> </start> <state g="170,134,174,52" name="开发票"> <transition g="653,158:" to="join2"/> </state> <state g="173,208,174,52" name="装车"> <transition g="404,230:" to="join1"/> </state> <state g="174,272,174,52" name="打印订购单"> <transition g="402,303:" to="join1"/> </state> <!-- 3 个并行的分支--> <fork g="103,211,174,52" name="fork1"> <transition g="126,164:" to="开发票"/> <transition to="装车"/> <transition g="128,298:" to="打印订购单"/> </fork> <!-- 聚合 “装车” 与 “打印订购单” 的分支活动--> <join g="375,242,174,52" name="join1"> <transition to="发车到目的地"/> </join> <state g="445,241,174,52" name="发车到目的地"> <transition g="651,266:" to="join2"/> </state> <!-- 聚合所有活动--> <join g="629,187,174,52" name="join2"> <transition to="end1"/> </join> <end g="704,189,174,52" name="end1"/> </process>
测试代码:
//发起实例 ProcessInstance processInstance = executionService.startProcessInstanceByKey ("ConcurrencyGraphBased"); String pid = processInstance.getId(); //构造活动名称集合用于验证分支 Set<String> expectedActivityNames = new HashSet<String>(); expectedActivityNames.add("开发票"); expectedActivityNames.add("装车"); expectedActivityNames.add("打印订购单"); //断言当前活动,即为产生的三个分支 assertEquals(expectedActivityNames, processInstance.findActiveActivityNames()); //发出执行信号,通过 "开发票" 活动,流程会在最后的聚合活动 “final join” 上等待其他分支的到来 String sendInvoiceExecutionId = processInstance.findActiveExecutionIn("开发票").getId(); processInstance = executionService.signalExecutionById(sendInvoiceExecutionId); expectedActivityNames.remove("开发票"); //断言还有两个分支在等待 assertNotNull(processInstance.findActiveExecutionIn("装车")); assertNotNull(processInstance.findActiveExecutionIn("打印订购单")); //发出执行信号,通过 装车 分支活动 String loadTruckExecutionId = processInstance.findActiveExecutionIn("装车") .getId(); processInstance = executionService.signalExecutionById(loadTruckExecutionId); expectedActivityNames.remove("装车"); //发出执行信号,通过 打印订购单 分支活动 String printShippingDocumentsId = processInstance.findActiveExecutionIn("打印订购单") .getId(); processInstance = executionService.signalExecutionById(printShippingDocumentsId); expectedActivityNames.remove("打印订购单"); //断言通过了第一个聚合活动 join1, 到达了 “发车到目的地” 活动 expectedActivityNames.add("发车到目的地"); assertEquals(expectedActivityNames, processInstance.findActiveActivityNames()); assertNotNull(processInstance.findActiveExecutionIn("发车到目的地")); //发出执行信号,通过 "发车到目的地" 分支活动 String driveTruckExecutionId = processInstance.findActiveExecutionIn("发车到目的地").getId(); processInstance = executionService.signalExecutionById(driveTruckExecutionId); //最终的聚合活动,等它最后一个流入转移后,就会流向 end 活动,至此所有流程实例结束。 assertNull("execution " + pid + " should not exist", executionService .findExecutionById(pid));
相关文章推荐
- 说说 jBPM 流程定义语言(9)—— 自定义活动
- 说说 jBPM 流程定义语言(6)—— end (结束活动)
- 说说 jBPM 流程定义语言(7)—— task(人工任务活动)
- 说说 jBPM 流程定义语言(2)—— start 活动 (启动活动)
- 说说 jBPM 流程定义语言(3)—— state 活动 (状态活动)
- 说说 jBPM 流程定义语言(8)—— sub-process(子流程活动)
- 09-jbpm工作流之"分支聚合Join-Fork"
- 说说 jBPM 流程定义语言(11)—— 事件
- 说说 jBPM 流程定义语言(1)—— process
- JBPM4.4:API风格、管理(部署、删除、更改、查询(文件资源、活动坐标))流程定义
- 一步一步学JBPM(2)——JPDL流程定义语言
- JBPM(六)——掌握JBPM流程定义语言
- jbpm流程设计之fork、join
- jBPM流程定义语言(JPDL)
- 一、工单流程JBPM-------JPDL流程定义语言
- JBPM4.4:流程定义语言和活动、事件
- JBPM表达业务流程(流程定义语言)
- jBPM用户指南 第16章 jBPM流程定义语言 (转载)
- 【JBPM4】流程分支fork - join
- 一步一步学JBPM(2)——JPDL流程定义语言