![](https://img.kancloud.cn/ae/3c/ae3c16005e6612fb273abd0be9095751_1225x174.png)
并行网关允许将流程分成多条分支,也可以把多条分支汇聚到一起,并行网关的功能是基于进入和外出顺序流的。
<br/>
`fork分支`:并行后的所有外出顺序流,为每个顺序流都创建一个并发分支。
`join汇聚`: 所有到达并行网关,在此等待的进入分支, 直到所有进入顺序流的分支都到达以后, 流程就会通过汇聚网关。
<br/>
注意,如果同一个并行网关有多个进入和多个外出顺序流, 它就同时具有分支和汇聚功能。 这时,网关会先汇聚所有进入的顺序流,然后再切分成多个并行分支。
<br/>
<mark>与其他网关的主要区别是,并行网关不会解析条件。即使顺序流中定义了条件,也会被忽略。</mark>
<br/>
演示,步骤如下:
**1. 流程定义**
![](https://img.kancloud.cn/73/06/73067a9163da31cc8fda2db7357afca7_666x549.png)
技术经理和项目经理是两个execution分支,在act_ru_execution表有两条记录分别是技术经理和项目经理,act_ru_execution还有一条记录表示该流程实例。
待技术经理和项目经理任务全部完成,在汇聚点汇聚,通过parallelGateway并行网关。
并行网关在业务应用中常用于会签任务,会签任务即多个参与者共同办理的任务。
**2. java程序**
```java
public class ActivitiGatewayParallel {
/**
* 部署流程定义
*/
@Test
public void testDeployment() {
//1、创建ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2、得到RepositoryService实例
RepositoryService repositoryService = processEngine.getRepositoryService();
//3、使用RepositoryService进行部署
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("bpmn/evection-parallel.bpmn")
.addClasspathResource("bpmn/evection.png")
.name("出差申请流程-并行网关")
.deploy();
//4、输出部署信息
System.out.println("流程部署id:" + deployment.getId());
System.out.println("流程部署名称:" + deployment.getName());
}
/**
* 启动流程实例,设置流程变量的值
*/
@Test
public void startProcess() {
//获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取RunTimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
//流程定义key
String key = "parallel";
//创建变量集合
Map<String, Object> map = new HashMap<String, Object>();
//创建出差pojo对象
Evection evection = new Evection();
//设置出差天数
evection.setNum(4d);
//定义流程变量,把出差pojo对象放入map
map.put("evection", evection);
//启动流程实例,并设置流程变量的值(把map传入)
ProcessInstance processInstance = runtimeService
.startProcessInstanceByKey(key, map);
//输出
System.out.println("流程实例名称=" + processInstance.getName());
System.out.println("流程定义id==" + processInstance.getProcessDefinitionId());
}
/**
* 启动流程实例
*/
@Test
public void testStartProcess() {
//1、创建ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2、获取RunTimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
//3、根据流程定义Id启动流程
ProcessInstance processInstance = runtimeService
.startProcessInstanceByKey("parallel");
//输出内容
System.out.println("流程定义id:" + processInstance.getProcessDefinitionId());
System.out.println("流程实例id:" + processInstance.getId());
System.out.println("当前活动Id:" + processInstance.getActivityId());
}
@Test
public void completTask() {
//流程定义的Key
String key = "parallel";
//任务负责人
String assingee = "jack";
//获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取taskservice
TaskService taskService = processEngine.getTaskService();
//查询任务
Task task = taskService.createTaskQuery()
.processDefinitionKey(key)
.taskAssignee(assingee)
.singleResult();
if (task != null) {
//根据任务id来完成任务
taskService.complete(task.getId());
}
}
}
```
**3. 测试结果**
当执行到并行网关数据库跟踪如下:
(1)有两个任务当前执行。
```sql
select * from act_ru_task;
```
![](https://img.kancloud.cn/63/60/6360d82f21d6adb519999f1eb48c944a_946x54.png)
(2)当前流程实例有多个分支(两个)在运行。
```sql
select * from act_ru_execution ;
```
![](https://img.kancloud.cn/b0/a0/b0a0b053a2310b0f3a6e966557b0f112_912x72.png)
(3)执行技术经理任务后,查询当前任务表,已完成的技术经理任务在当前任务表act_ru_task_已被删除。
```sql
select * from act_ru_task;
```
![](https://img.kancloud.cn/18/15/18157cd87ac619e8d9af78275d432b01_606x41.png)
(4)在流程实例执行表中多个分支存在且有并行网关的汇聚结点。
```sql
select * from act_ru_execution ;
```
![](https://img.kancloud.cn/98/b5/98b50a9d9f75efc6b9d3f4eb20ac94aa_917x76.png)
(5)当所有分支任务都完成,都到达汇聚结点后,执行流程实例已经变为总经理审批,说明流程执行已经通过并行网关。
```sql
select * from act_ru_execution ;
```
![](https://img.kancloud.cn/77/6d/776d00c7f6770c39185187d1de2dd1bd_917x61.png)
- Activiti流程引擎
- 工作流介绍
- Activiti是什么
- Activiti流程处理步骤
- Activiti环境搭建
- 搭建步骤
- 表结构介绍
- ActivitiAPI结构
- 认识流程符号
- 流程设计器的使用
- 流程处理步骤
- 乱码问题
- 流程实例
- 流程实例是什么
- 业务标识
- 查询流程实例
- 挂起/激活流程实例
- 个人任务
- 分配任务负责人
- 查询待办任务
- 办理权限
- 流程变量
- 流程变量类型
- 流程变量作用域
- 使用流程变量控制流程
- 组任务
- 设置任务候选人
- 组任务办理流程
- 网关
- 4种网关类型
- 排他网关
- 并行网关
- 包含网关
- 事件网关
- Spring整合Activiti
- SpringBoot整合Activiti
- Flowable流程引擎
- Flowable是什么
- Flowable与Activiti
- Flowable环境搭建
- FlowableAPI
- 流程引擎API与服务
- 流程处理步骤
- 流程部署
- 流程部署方式
- 流程定义版本
- 删除已部署的流程
- 下载资源
- 流程实例
- 什么是流程实例
- 业务标识
- 查询流程实例
- 挂起/激活流程实例
- 分配任务负责人
- 固定分配
- UEL表达式分配
- 监听器分配
- 办理权限
- 流程变量
- 流程变量类型
- 流程变量作用域
- 流程变量控制流程
- 组任务
- 设置任务候选人
- 组任务办理流程
- 网关
- 排他网关
- 并行网关
- 包含网关
- 事件网关
- 历史查询
- 查询历史
- Spring整合Flowable
- 配置文件整合
- 配置类整合
- SpringBoot整合Flowable