🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
![](https://img.kancloud.cn/ae/3c/ae3c16005e6612fb273abd0be9095751_1225x174.png) 排他网关,用来在流程中实现决策。 当流程执行到这个网关,所有分支都会判断条件是否为true,如果为true则执行该分支。 <br/> **注意**:排他网关只会选择一个为true的分支执行。如果有两个分支条件都为true,排他网关会选择id值较小的一条分支去执行。 <br/> 为什么要用排他网关? 不用排他网关也可以实现分支,如在连线的condition条件上设置分支条件。 在连线设置condition条件的缺点:如果条件都不满足,流程就结束了(是异常结束)。 如果使用排他网关决定分支的走向,则从网关出去的线所有条件都不满足则系统抛出异常。 ```java org.activiti.engine.ActivitiException: No outgoing sequence flow of the exclusive gateway 'exclusivegateway1' could be selected for continuing the process at org.activiti.engine.impl.bpmn.behavior.ExclusiveGatewayActivityBehavior.leave(ExclusiveGatewayActivityBehavior.java:85) ``` <br/> 演示,步骤如下: **1. 流程定义** ![](https://img.kancloud.cn/c0/b6/c0b67cd6156388749a00927ba73f8dd4_844x376.png) **2. java程序** ```java public class ActivitiGatewayExclusive { /** * 部署流程定义 */ @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-exclusive.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 = "exclusive"; //创建变量集合 Map<String, Object> map = new HashMap<String, Object>(); //创建出差pojo对象 Evection evection = new Evection(); //设置出差天数 evection.setNum(2d); //定义流程变量,把出差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 = "exclusive"; //任务负责人 String assingee = "jerry"; //获取流程引擎 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. 测试结果** 在部门经理审核后,走排他网关,从排他网关出来的分支有两条,一条是判断出差天数是否大于3天,另一条是判断出差天数是否小于等于3天。 设置分支条件时,如果所有分支条件都不是true,报错: ```java org.activiti.engine.ActivitiException: No outgoing sequence flow of the exclusive gateway 'exclusivegateway1' could be selected for continuing the process at org.activiti.engine.impl.bpmn.behavior.ExclusiveGatewayActivityBehavior.leave(ExclusiveGatewayActivityBehavior.java:85) ```