说说 jBPM 流程定义语言(5)—— fork - join (分支、聚合活动)

当我们需要流程并发(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 活动上防止两个还没有聚合的同步事务活动互相锁定对象的事务资源,从而导致死锁。
说说 jBPM 流程定义语言(5)—— fork - join (分支、聚合活动)_第1张图片
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));

你可能感兴趣的:(说说 jBPM 流程定义语言(5)—— fork - join (分支、聚合活动))