1. 排他网关
排他网关(exclusive gateway)用于对流程中的决策建模,当执行到达这个网关时,会按照所有出口顺序流定义的顺序对它们进行计算,选择第一个条件计算为 true
的顺序流(当没有设置条件时,认为当前顺序流为 true
)继续流程。
(1)流程图
(2)测试
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.HashMap;
import java.util.Map;
/**
* @Author Suaxi
* @Date 2024/7/15 21:26
* @Description
*/
@SpringBootTest
public class ExclusiveGatewayTest {
@Autowired
private RepositoryService repositoryService;
@Autowired
private RuntimeService runtimeService;
@Autowired
private TaskService taskService;
@Test
public void deploy() {
Deployment deploy = repositoryService.createDeployment()
.name("网关-排他网关")
.addClasspathResource("flow/10.网关-排他网关.bpmn")
.deploy();
System.out.println(deploy.getId());
}
@Test
public void startProcess() {
String processId = "Process_18phe80:1:5fc9d4f7-42ae-11ef-b9f8-a8a1592cf182";
runtimeService.startProcessInstanceById(processId);
}
@Test
public void completeTask() {
String taskId = "ad9c02f2-42ae-11ef-ad23-a8a1592cf182";
Map<String, Object> variables = new HashMap<>();
variables.put("day", 4);
taskService.complete(taskId, variables);
}
}
注:当排他网关执行过程中有多个条件都满足时,流程引擎会根据bpmn流程图中顺序流的绘制顺序从前往后(从上到下)的顺序走
2. 并行网关
并行网关(parallel gateway)允许将流程分为多条分支,也可以把多条分支汇聚到一起,并行网关的功能基于进入/外出顺序流:
- fork分支:并行后的所有外出顺序流,为每个顺序流都创建一个并发分支
- join汇聚:所有到达并行网关,在此等待的进入分支,直到所有进入顺序流的分支都到达以后,流程就会通过汇聚网关
如果一个并行网关既有进入,也有外出顺序六流(即同时具有分支和汇聚的功能),此时网关会先汇聚所有进入的顺序流,然后再切分成多个并行分支
并行网关不会解析条件,即使在顺序流中定义了,也会被忽略
(1)流程图
(2)测试
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;
/**
* @Author Suaxi
* @Date 2024/7/16 21:58
* @Description
*/
@SpringBootTest
public class ParallelGatewayTest {
@Autowired
private RepositoryService repositoryService;
@Autowired
private RuntimeService runtimeService;
@Autowired
private TaskService taskService;
@Test
public void deploy() {
Deployment deploy = repositoryService.createDeployment()
.name("网关-并行网关")
.addClasspathResource("flow/11.网关-并行网关.bpmn")
.deploy();
System.out.println(deploy.getId());
}
@Test
public void startProcess() {
String processId = "Process_1tykzow:1:93a6df9a-437b-11ef-92d6-a8a1592cf182";
runtimeService.startProcessInstanceById(processId);
}
@Test
public void completeTask() {
String taskId = "e5988111-437b-11ef-90a3-a8a1592cf182";
taskService.complete(taskId);
}
}
当组长审批完成后,汇聚网关会等待项目经理审批、人事审批分支顺序流完成后才进入到总经理审批节点
3. 包含网关
包含网关(inclusive gateway)可以看作是排他网关和并行网关的结合体,和排他网关一样,包含网关可以在外出顺序流上定义条件。
- 分支:所有外出顺序流的条件都会被解析,结果为
true
的顺序流会以并行方式继续执行,会为每个顺序流创建一个分支 - 汇聚:所有并行分支到达包含网关,会进入等待状态,直到每个包含流程token的进入顺序流的分支都到达,这是与并行网关最大的不同(即包含网关只会等待被选中执行了的进入顺序流),在汇聚之后,流程继续往后执行
(1)流程图
(2)测试
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.HashMap;
import java.util.Map;
/**
* @Author Suaxi
* @Date 2024/7/17 21:32
* @Description
*/
@SpringBootTest
public class InclusiveGatewayTest {
@Autowired
private RepositoryService repositoryService;
@Autowired
private RuntimeService runtimeService;
@Autowired
private TaskService taskService;
@Test
public void deploy() {
Deployment deploy = repositoryService.createDeployment()
.name("网关-包容网关")
.addClasspathResource("flow/12.网关-包容网关.bpmn")
.deploy();
System.out.println(deploy.getId());
}
@Test
public void startProcess() {
String processId = "Process_1j4dy1f:1:ca7ae82d-4441-11ef-8b7e-a8a1592cf182";
runtimeService.startProcessInstanceById(processId);
}
@Test
public void completeTask() {
String taskId = "e1ea5b22-4441-11ef-ac89-a8a1592cf182";
Map<String, Object> variables = new HashMap<>();
variables.put("day", 4);
taskService.complete(taskId, variables);
}
}
当组长审批完成,且传入的变量day为4时,流程走向如下(走了未设置条件和满足条件的两条线):
任务表中的数据为:
评论 (0)