
包含網關可以看做是排他網關和并行網關的結合體。
<br/>
和排他網關一樣,你可以在外出順序流上定義條件,包含網關會解析它們。 但是主要的區別是包含網關可以選擇多于一條順序流,這和并行網關一樣。
<br/>
包含網關的功能是基于進入和外出順序流的:
* **分支**: 所有外出順序流的條件都會被解析,結果為`true`的順序流會以并行方式繼續執行, 會為每個順序流創建一個分支。
* **匯聚**: 所有并行分支到達包含網關,會進入等待狀態, 直到每個包含流程 token 的進入順序流的分支都到達。 這是與并行網關的最大不同。換句話說,包含網關只會等待被選中執行了的進入順序流。 在全部匯聚之后,流程會穿過包含網關繼續執行。
<br/>
如果包含網關設置的條件中,流程變量不存在,報錯。
```java
org.flowable.engine.common.api.FlowableException: Unknown property used in expression: ${evection.num>=3}
```
<br/>
演示,步驟如下:
**1. 流程定義**
:-: 
`evection-inclusive.bpmn`
**2. java程序**
```java
public class FlowableGatewayInclusive {
/**
* 1. 部署流程
*/
@Test
public void testDeployment() {
//1、獲取ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2、獲取RepositoryService
RepositoryService repositoryService = processEngine.getRepositoryService();
//3、部署流程
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("bpmn/evection-inclusive.bpmn")
.name("出差申請流程")
.deploy();
//流程部署id:72501
System.out.println("流程部署id:" + deployment.getId());
//流程部署名稱:出差申請流程
System.out.println("流程部署名稱:" + deployment.getName());
}
/**
* 2. 啟動流程實例,設置流程變量
*/
@Test
public void startProcess() {
//獲取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//獲取RunTimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
//流程key
String key = "evection-inclusive";
//創建變量集合
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);
//流程定義id: evection-inclusive:1:72504
System.out.println("流程定義id: " + processInstance.getProcessDefinitionId());
//流程實例id: 75001
System.out.println("流程實例id: " + processInstance.getProcessInstanceId());
//流程版本: 1
System.out.println("流程版本: " + processInstance.getProcessDefinitionVersion());
}
/**
* 3. 完成個人任務
*/
@Test
public void completTask() {
//流程Key
String key = "evection-inclusive";
//任務負責人
String assingee = "tom";
//獲取流程引擎
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());
//tom完成了任務{id=75008, name=出差申請}
System.out.println(task.getAssignee() + "完成了任務{id=" + task.getId()
+ ", name=" + task.getName() + "}");
}
}
}
```
**3. 測試結果**
(1)當流程執行到第一個包含網關后,會根據條件判斷,下一步要走哪幾個分支。
```sql
mysql> select * from act_ru_task;
| ID_ | REV_ | EXECUTION_ID_ | PROC_INST_ID_ | PROC_DEF_ID_ | TASK_D...E_TYPE_ | SCOPE_DEFI...
+-------+------+---------------+---------------+----------------------------+-----...------+----------------...
| 77504 | 1 | 75005 | 75001 | evection-inclusive:1:72504 | NULL | . .. | 人事經理 | N. ..
| 77508 | 1 | 77502 | 75001 | evection-inclusive:1:72504 | NULL | . .. | 項目經理 | N. ..
+-------+------+---------------+---------------+----------------------------+-----...------+----------------...
```
(2)當人事經理節點與項目經理節點的任務<mark>都完成</mark>后第二個包含網關才會走下一個分支。
```sql
mysql> select * from act_ru_task;
+-------+------+---------------+---------------+---------------------...----+--------------------...
| ID_ | REV_ | EXECUTION_ID_ | PROC_INST_ID_ | PROC_DEF_ID_ ..._TYPE_ | SCOPE_DEFINIT...
+-------+------+---------------+---------------+---------------------...----+--------------------...
| 82504 | 1 | 77502 | 75001 | evection-inclusive:1:72504 | ... | 總經理 | NULL ...
+-------+------+---------------+---------------+---------------------...----+--------------------...
```
>[info]小結:在分支時,需要判斷條件,**符合條件的分支,將會執行**,符合條件的分支最終才進行匯聚。
- Activiti流程引擎
- 工作流介紹
- Activiti是什么
- Activiti流程處理步驟
- Activiti環境搭建
- 搭建步驟
- 表結構介紹
- ActivitiAPI結構
- 認識流程符號
- 流程設計器的使用
- 流程處理步驟
- 亂碼問題
- 流程實例
- 流程實例是什么
- 業務標識
- 查詢流程實例
- 掛起/激活流程實例
- 個人任務
- 分配任務負責人
- 查詢待辦任務
- 辦理權限
- 流程變量
- 流程變量類型
- 流程變量作用域
- 使用流程變量控制流程
- 組任務
- 設置任務候選人
- 組任務辦理流程
- 網關
- 4種網關類型
- 排他網關
- 并行網關
- 包含網關
- 事件網關
- Spring整合Activiti
- SpringBoot整合Activiti
- Flowable流程引擎
- Flowable是什么
- Flowable與Activiti
- Flowable環境搭建
- FlowableAPI
- 流程引擎API與服務
- 流程處理步驟
- 流程部署
- 流程部署方式
- 流程定義版本
- 刪除已部署的流程
- 下載資源
- 流程實例
- 什么是流程實例
- 業務標識
- 查詢流程實例
- 掛起/激活流程實例
- 分配任務負責人
- 固定分配
- UEL表達式分配
- 監聽器分配
- 辦理權限
- 流程變量
- 流程變量類型
- 流程變量作用域
- 流程變量控制流程
- 組任務
- 設置任務候選人
- 組任務辦理流程
- 網關
- 排他網關
- 并行網關
- 包含網關
- 事件網關
- 歷史查詢
- 查詢歷史
- Spring整合Flowable
- 配置文件整合
- 配置類整合
- SpringBoot整合Flowable