说说 jBPM 流程定义语言(5)—— fork - join (分支、聚合活动)
发布日期:2021-06-29 21:09:42 浏览次数:2 分类:技术文章

本文共 2572 字,大约阅读时间需要 8 分钟。

当我们需要流程并发(concurrency)执行时,就需要使用到 fork-join 活动组合,fork活动可以使流程在一条主干上出现并行的分支,join 活动则可以使流程的并行分支聚合成一条主干。

Fork 活动具有1个 name 属性和 n 个流出转移元素。

join 活动的独特属性:

属性 类型 默认值 是否必需 描述
multiplicity integer 流入转移数 可选 流程执行中,当指定的流入转移数量(multiplicity)到达 join 活动后,流程即会聚合,沿着 join 活动的唯一流出转移继续执行流转。其他未到达的流入转移则会忽略,从而实现按流入转移数量聚合的场景,因此,multiplicity 属性不应该大于 join 活动定义流入转移数量。
lockmode 字符串枚举:none、read、upgrade、upgrade_nowait、wirte upgrade 可选 指定 hibernate 的数据锁模式。因为 join 活动支持并发自动活动事务,因此需要在 join 活动上防止两个还没有聚合的同步事务活动互相锁定对象的事务资源,从而导致死锁。

 fork - join 流程定义

流程定义文件:

测试代码:

//发起实例ProcessInstance processInstance = executionService.startProcessInstanceByKey		("ConcurrencyGraphBased");String pid = processInstance.getId();//构造活动名称集合用于验证分支Set
expectedActivityNames = new HashSet
();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));

转载地址:https://deniro.blog.csdn.net/article/details/79277650 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:深入理解 Java 虚拟机的内存管理机制与异常处理
下一篇:说说 jBPM 流程定义语言(4)—— decision 活动 (判断活动)

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2024年04月08日 05时25分25秒