🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
![](https://img.kancloud.cn/ae/3c/ae3c16005e6612fb273abd0be9095751_1225x174.png) 排他网关,用来在流程中实现决策。 当流程执行到这个网关,所有分支都会判断条件是否为`true`,如果为`true`则执行该分支。 <br/> >[warning]注意:排他网关只会选择一个为`true`的分支执行。如果有两个分支条件都为`true`,排他网关会选择 id 值较小的一条分支去执行。 为什么要用排他网关? 不用排他网关也可以实现分支,如在连线的 condition 条件上设置分支条件。 在连线设置 condition 条件的缺点:如果条件都不满足,流程就异常结束了。 如果使用排他网关决定分支的走向,则从网关出去所有线的条件都不满足则系统抛出异常。 ```java org.flowable.engine.common.api.FlowableException: No outgoing sequence flow of the exclusive gateway '_14' could be selected for continuing the process ``` <br/> 演示,步骤如下: **1. 流程定义** :-: ![](https://img.kancloud.cn/c0/b6/c0b67cd6156388749a00927ba73f8dd4_844x376.png) `evection-exclusive.bpmn` **2. java程序** ```java public class FlowableGatewayExclusive { /** * 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-exclusive.bpmn") .name("出差申请流程") .deploy(); //流程部署id:45001 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-exclusive"; //创建变量集合 Map<String, Object> map = new HashMap<String, Object>(); //创建出差pojo对象 Evection evection = new Evection(); //设置出差天数为2天 evection.setNum(2d); //定义流程变量,把出差pojo对象放入map map.put("evection", evection); //根据流程key启动流程实例,并设置流程变量的值 ProcessInstance processInstance = runtimeService .startProcessInstanceByKey(key, map); //流程定义id: evection-exclusive:1:52504 System.out.println("流程定义id: " + processInstance.getProcessDefinitionId()); //流程实例id: 流程实例id: 55001 System.out.println("流程实例id: " + processInstance.getProcessInstanceId()); //流程版本: 1 System.out.println("流程版本: " + processInstance.getProcessDefinitionVersion()); } /** * 3. 完成个人任务 */ @Test public void completTask() { //流程Key String key = "evection-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()); //jerry完成了任务{id=57502, name=部门经理审批} System.out.println(task.getAssignee() + "完成了任务{id=" + task.getId() + ", name=" + task.getName() + "}"); } } } ``` **3. 测试结果** 在部门经理审核后,走排他网关,从排他网关出来的分支有两条,一条是判断出差天数是否大于3天,另一条是判断出差天数是否小于等于3天。 <br/> 上面设置的出差天数为两天,所以从排他网关出来后直接到财务审批节点。 **** 参考文档:https://tkjohn.github.io/flowable-userguide/#bpmnGateways