
并行網關允許將流程分成多條分支,也可以把多條分支匯聚到一起,并行網關的功能是基于進入和外出順序流的。
<br/>
`fork分支`:并行后的所有外出順序流,為每個順序流都創建一個并發分支。
`join匯聚`: 所有到達并行網關,在此等待的進入分支, 直到所有進入順序流的分支都到達以后, 流程就會通過匯聚網關。
<br/>
注意,如果同一個并行網關有多個進入和多個外出順序流, 它就同時具有分支和匯聚功能。 這時,網關會先匯聚所有進入的順序流,然后再切分成多個并行分支。
<br/>
<mark>與其他網關的主要區別是,并行網關不會解析條件。即使順序流中定義了條件,也會被忽略。</mark>
<br/>
演示,步驟如下:
**1. 流程定義**

技術經理和項目經理是兩個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;
```

(2)當前流程實例有多個分支(兩個)在運行。
```sql
select * from act_ru_execution ;
```

(3)執行技術經理任務后,查詢當前任務表,已完成的技術經理任務在當前任務表act_ru_task_已被刪除。
```sql
select * from act_ru_task;
```

(4)在流程實例執行表中多個分支存在且有并行網關的匯聚結點。
```sql
select * from act_ru_execution ;
```

(5)當所有分支任務都完成,都到達匯聚結點后,執行流程實例已經變為總經理審批,說明流程執行已經通過并行網關。
```sql
select * from act_ru_execution ;
```

- Activiti流程引擎
- 工作流介紹
- Activiti是什么
- Activiti流程處理步驟
- Activiti環境搭建
- 搭建步驟
- 表結構介紹
- ActivitiAPI結構
- 認識流程符號
- 流程設計器的使用
- 流程處理步驟
- 亂碼問題
- 流程實例
- 流程實例是什么
- 業務標識
- 查詢流程實例
- 掛起/激活流程實例
- 個人任務
- 分配任務負責人
- 查詢待辦任務
- 辦理權限
- 流程變量
- 流程變量類型
- 流程變量作用域
- 使用流程變量控制流程
- 組任務
- 設置任務候選人
- 組任務辦理流程
- 網關
- 4種網關類型
- 排他網關
- 并行網關
- 包含網關
- 事件網關
- Spring整合Activiti
- SpringBoot整合Activiti
- Flowable流程引擎
- Flowable是什么
- Flowable與Activiti
- Flowable環境搭建
- FlowableAPI
- 流程引擎API與服務
- 流程處理步驟
- 流程部署
- 流程部署方式
- 流程定義版本
- 刪除已部署的流程
- 下載資源
- 流程實例
- 什么是流程實例
- 業務標識
- 查詢流程實例
- 掛起/激活流程實例
- 分配任務負責人
- 固定分配
- UEL表達式分配
- 監聽器分配
- 辦理權限
- 流程變量
- 流程變量類型
- 流程變量作用域
- 流程變量控制流程
- 組任務
- 設置任務候選人
- 組任務辦理流程
- 網關
- 排他網關
- 并行網關
- 包含網關
- 事件網關
- 歷史查詢
- 查詢歷史
- Spring整合Flowable
- 配置文件整合
- 配置類整合
- SpringBoot整合Flowable