![](https://img.kancloud.cn/ae/3c/ae3c16005e6612fb273abd0be9095751_1225x174.png)
包含网关可以看做是排他网关和并行网关的结合体。
和排他网关一样,你可以在外出顺序流上定义条件,包含网关会解析它们。 但是主要的区别是包含网关可以选择多于一条顺序流,这和并行网关一样。
<br/>
包含网关的功能是基于进入和外出顺序流的:
**分支**: 所有外出顺序流的条件都会被解析,结果为true的顺序流会以并行方式继续执行, 会为每个顺序流创建一个分支。
**汇聚**: 所有并行分支到达包含网关,会进入等待状态, 直到每个包含流程token的进入顺序流的分支都到达。 这是与并行网关的最大不同。换句话说,包含网关只会等待被选中执行了的进入顺序流。 在汇聚之后,流程会穿过包含网关继续执行。
<br/>
如果包含网关设置的条件中,流程变量不存在,报错。
```java
org.activiti.engine.ActivitiException: Unknown property used in expression: ${evection.num>=3}
```
<br/>
演示,步骤如下:
**1. 流程定义**
![](https://img.kancloud.cn/77/eb/77eb92486a7ea2b91edce15f5885325e_703x560.png)
**2. java程序**
```java
public class ActivitiGatewayInclusive {
/**
* 部署流程定义
*/
@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-inclusive.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 = "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);
//输出
System.out.println("流程实例名称=" + processInstance.getName());
System.out.println("流程定义id==" + processInstance.getProcessDefinitionId());
}
@Test
public void completTask() {
//流程定义的Key
String key = "inclusive";
//任务负责人
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_execution ;
```
![](https://img.kancloud.cn/83/7b/837b135ff6c0a93aa2f78362295230fe_889x95.png)
第一条记录:包含网关分支。
后两条记录代表两个要执行的分支:
ACT_ID = "_13" 代表 项目经理审批。
ACT_ID = "_5" 代表 人事经理审批。
```sql
# 当前任务表
select * from act_ru_task;
```
![](https://img.kancloud.cn/d4/d6/d4d669834126f3dfe6189eeeb71407a6_883x75.png)
上图中,项目经理审批、人事经理审批 都是当前的任务,在并行执行。如果有一个分支执行先走到汇聚结点的分支,要等待其它执行分支走到汇聚。
(2)先执行项目经理审批,然后查询当前任务表:`ACT_RU_TASK`。
![](https://img.kancloud.cn/98/62/986237c7dfec4d84b750f650e9efc36d_940x55.png)
当前任务还有人事经理审批需要处理。
```sql
# 流程实例执行表
select * from act_ru_execution ;
```
![](https://img.kancloud.cn/00/e2/00e23d235fd0c8843e722dde11e93f3e_901x73.png)
发现人事经理的分支还存在,而项目经理分支已经走到ACT_ID = _18的节点。而`ACT_ID=_18`就是第二个包含网关。这时,因为有2个分支要执行,包含网关会等所有分支走到汇聚才能执行完成。
(3)执行人事经理审批。
```sql
# 当前任务表
select * from act_ru_task;
```
![](https://img.kancloud.cn/60/d7/60d75a63f116eb667724c89719e02ee1_915x42.png)
当前任务表已经不是人事经理审批了,说明人事经理审批已经完成。
```sql
# 流程实例执行表
select * from act_ru_execution ;
```
![](https://img.kancloud.cn/80/49/80491a82db575ec3efbc8aa13420c1d4_900x56.png)
包含网关执行完成,分支和汇聚就从act\_ru\_execution删除。
<br/>
小结:在分支时,需要判断条件,**符合条件的分支,将会执行**,符合条件的分支最终才进行汇聚。
- Activiti流程引擎
- 工作流介绍
- Activiti是什么
- Activiti流程处理步骤
- Activiti环境搭建
- 搭建步骤
- 表结构介绍
- ActivitiAPI结构
- 认识流程符号
- 流程设计器的使用
- 流程处理步骤
- 乱码问题
- 流程实例
- 流程实例是什么
- 业务标识
- 查询流程实例
- 挂起/激活流程实例
- 个人任务
- 分配任务负责人
- 查询待办任务
- 办理权限
- 流程变量
- 流程变量类型
- 流程变量作用域
- 使用流程变量控制流程
- 组任务
- 设置任务候选人
- 组任务办理流程
- 网关
- 4种网关类型
- 排他网关
- 并行网关
- 包含网关
- 事件网关
- Spring整合Activiti
- SpringBoot整合Activiti
- Flowable流程引擎
- Flowable是什么
- Flowable与Activiti
- Flowable环境搭建
- FlowableAPI
- 流程引擎API与服务
- 流程处理步骤
- 流程部署
- 流程部署方式
- 流程定义版本
- 删除已部署的流程
- 下载资源
- 流程实例
- 什么是流程实例
- 业务标识
- 查询流程实例
- 挂起/激活流程实例
- 分配任务负责人
- 固定分配
- UEL表达式分配
- 监听器分配
- 办理权限
- 流程变量
- 流程变量类型
- 流程变量作用域
- 流程变量控制流程
- 组任务
- 设置任务候选人
- 组任务办理流程
- 网关
- 排他网关
- 并行网关
- 包含网关
- 事件网关
- 历史查询
- 查询历史
- Spring整合Flowable
- 配置文件整合
- 配置类整合
- SpringBoot整合Flowable