说说 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 活动上防止两个还没有聚合的同步事务活动互相锁定对象的事务资源,从而导致死锁。 |
流程定义文件:
测试代码:
//发起实例ProcessInstance processInstance = executionService.startProcessInstanceByKey ("ConcurrencyGraphBased");String pid = processInstance.getId();//构造活动名称集合用于验证分支SetexpectedActivityNames = 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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
网站不错 人气很旺了 加油
[***.192.178.218]2024年04月08日 05时25分25秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
迭代器学习之二:数组的可枚举类型和枚举数的定义以及编译器的foreach工作原理
2021-07-03
迭代器学习之三:IEnumerable和IEnumerator的泛型结构
2021-07-03
迭代器学习之四:关于yield的深入了解
2021-07-03
ORA-02046: ORA-02046:分布式事务处理已经开始
2021-07-03
栈-堆-C#详解
2021-07-03
值类型-引用类型
2021-07-03
C# Random生成随机数字和字母
2021-07-03
c# 扩展方法奇思妙用基础篇四:Random 扩展
2021-07-03
创建和读写文件的一些简单方法
2021-07-03
XmlDocument操作xml文档
2021-07-03
.Net那点事儿系列:C#操作Xml:通过XmlDocument读写Xml文档
2021-07-03
使用XmlDocument创建XML文档及增加删除更新节点
2021-07-03
XML: 使用XmlDocument 与 XmlReader 类
2021-07-03
NET ListView选中行的定位显示
2021-07-03
C#设置窗体最大化 最小化 顶端显示
2021-07-03
C#窗体的最大化/最小化/还原/最小化到托盘/NotifyIcon的代码实现
2021-07-03
如何使程序最小化时出现在系统托盘中(C#)
2021-07-03
WinForm中实现最小化到系统托盘
2021-07-03