1. 概念
多实例活动是为业务流程中的某个步骤定义重复的一种方式,在编程概念中,多实例与 foreach 结构相匹配:它允许对给定集合中的每个项目按顺序或并行地执行某个步骤或一个完整的子流程
多实例是一个有额外属性的常规活动,它将导致该活动在运行时被多次执行,以下活动可成为多实例活动:
- Service Task 服务任务
- Send Task 发送任务
- User Task 用户任务
- Business Rule Task 业务规则任务
- Script Task 脚本任务
- Receive Task 接收任务
- Manual Task 手动任务
- (Embedded)Sub-Process (嵌入)子流程
- Call Activity 发起活动
- Transaction Subprocess 事务子流程
注:网关或事件不能用于多实例中
如果一个活动是多实例的,这将由活动底部的三条短线表示:三条垂直线 - 并行,三条竖线 - 顺序执行
按照规范,每个实例所创建的执行的每个父执行将有以下变量:
- nrOfInstances:实例总数量
- nrOfActiveInstances:当前活动的(且未完成)的实例数量,在顺序执行中这个数量恒为1
- nrOfCompletedInstances:已完成的实例数量
这些值可以通过 execution.getVariables()
方法获取
此外,每个创建的执行将有一个执行本地变量(即对其他执行不可见,且不存储在流程实例级别)
- loopCounter:表示该特定实例的
foreach
循环中的索引
为了使一个活动实例成为多实例,活动 xml 元素必须有一个 multiInstanceLoopCharacteristics
子元素
<multiInstanceLoopCharacteristics isSequential="false|true">
......
</multiInstanceLoopCharacteristics>
2. 并行会签-案例一
流程图
测试
package com.sw.camundademo;
import org.camunda.bpm.engine.RepositoryService;
import org.camunda.bpm.engine.RuntimeService;
import org.camunda.bpm.engine.repository.Deployment;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @Author Suaxi
* @Date 2024/8/8 22:25
* @Description
*/
@SpringBootTest
public class FlowMultiInstanceTest {
@Autowired
private RepositoryService repositoryService;
@Autowired
private RuntimeService runtimeService;
@Test
public void deploy() {
Deployment deploy = repositoryService.createDeployment()
.name("多人会签-并行会签-案例一")
.addClasspathResource("flow/32.多人会签-并行会签-案例一.bpmn")
.deploy();
System.out.println(deploy.getId());
}
@Test
public void startFlow() {
String processId = "Process_0riwap9:1:302f5906-5592-11ef-a63f-10ffe00abd05";
Map<String, Object> variables = new HashMap<>();
variables.put("persons", Arrays.asList("admin", "zhangsan", "lisi"));
runtimeService.startProcessInstanceById(processId, variables);
}
}
启动流程后,可看到有三个待审批的并行执行任务
3. 并行会签-案例二
流程图
MultiInstanceCompleteTaskListener
package com.sw.camundademo.listener;
import org.camunda.bpm.engine.delegate.DelegateExecution;
import org.springframework.stereotype.Component;
/**
* @Author Suaxi
* @Date 2024/8/9 23:03
* @Description
*/
@Component("multiInstanceCompleteTaskListener")
public class MultiInstanceCompleteTaskListener {
public Boolean completeTask(DelegateExecution execution) {
System.out.println("会签总数:" + execution.getVariable("nrOfInstances"));
System.out.println("当前获取的会签数量:" + execution.getVariable("nrOfActiveInstances"));
System.out.println("已经完成的会签数量:" + execution.getVariable("nrOfCompletedInstances"));
Boolean flag = (Boolean) execution.getVariable("flag");
System.out.println("当前审批意见:" + flag);
return flag;
}
}
测试
package com.sw.camundademo;
import org.camunda.bpm.engine.RepositoryService;
import org.camunda.bpm.engine.RuntimeService;
import org.camunda.bpm.engine.TaskService;
import org.camunda.bpm.engine.repository.Deployment;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
/**
* @Author Suaxi
* @Date 2024/8/8 22:25
* @Description
*/
@SpringBootTest
public class FlowMultiInstanceTest {
@Autowired
private RepositoryService repositoryService;
@Autowired
private RuntimeService runtimeService;
@Autowired
private TaskService taskService;
@Test
public void deploy() {
Deployment deploy = repositoryService.createDeployment()
.name("多人会签-并行会签-案例二")
.addClasspathResource("flow/33.多人会签-并行会签-案例二.bpmn")
.deploy();
System.out.println(deploy.getId());
}
@Test
public void startFlow() {
String processId = "Process_1whtv0v:1:c256cf1b-5661-11ef-b3fe-10ffe00abd05";
Map<String, Object> variables = new HashMap<>();
variables.put("persons", Arrays.asList("admin", "zhangsan", "lisi"));
runtimeService.startProcessInstanceById(processId, variables);
}
@Test
public void completeTask() {
String taskId = "ce5aac4c-5661-11ef-accb-10ffe00abd05";
Map<String, Object> variables = new HashMap<>();
variables.put("flag", true);
taskService.complete(taskId, variables);
}
}
根据设置的并行会签完成条件,当其中一人审批通过时即通过
4. 串行会签
流程图
测试
package com.sw.camundademo;
import org.camunda.bpm.engine.RepositoryService;
import org.camunda.bpm.engine.RuntimeService;
import org.camunda.bpm.engine.TaskService;
import org.camunda.bpm.engine.repository.Deployment;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
/**
* @Author Suaxi
* @Date 2024/8/8 22:25
* @Description
*/
@SpringBootTest
public class FlowMultiInstanceTest {
@Autowired
private RepositoryService repositoryService;
@Autowired
private RuntimeService runtimeService;
@Autowired
private TaskService taskService;
@Test
public void deploy() {
Deployment deploy = repositoryService.createDeployment()
.name("多人会签-串行会签")
.addClasspathResource("flow/34.多人会签-串行会签.bpmn")
.deploy();
System.out.println(deploy.getId());
}
@Test
public void startFlow() {
String processId = "Process_0sgnfjk:1:c8ba7ba3-57e0-11ef-b282-10ffe00abd05";
Map<String, Object> variables = new HashMap<>();
variables.put("persons", Arrays.asList("admin", "zhangsan", "lisi"));
runtimeService.startProcessInstanceById(processId, variables);
}
}
注:串行会签流程中,审批完一个,才出现下一个待审批任务,如果设置审批完成条件的话,也可以像并行会签流程中的例子一样,一人审批通过,则全部通过,流程进行到下一个节点
评论 (0)