Activiti7 网关(排他网关)

什么是排他网关?

排他网关(也叫异或(XOR)网关,或叫基于数据的排他网关),用于在流程中实现决策,当流程执行到这个网关,所有分支都会判断条件是否为true,如果为true则执行该分支

注意:排他网关只会选择一个为true的分支执行.(即使有两个分支条件都为true,排他网关也会只选择一条分支去执行)

为什么要用排他网关?

不用排他网关也能实现分支

 

 在连线的condition条件上设置分支条件

缺点:

如果条件都不满足,不使用排他网关,流程就结束了(异常结束)

如果使用排他网关决定分支的走向

 

 如果从网关出去的线所有条件都不满足则系统抛出异常

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)

说明:经过排他网关必须要有一条且只有一条分支走.

 

画图:

其他的都一样就是添加了一个排他网关

 

 部署->启动->提交任务

复制代码
package com.itheima.test;

import com.itheima.activiti.pojo.Holiday;
import org.activiti.engine.*;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Before;
import org.junit.Test;

import java.util.HashMap;
import java.util.Map;

/**
 * 网关测试
 */
public class ActivitiGatewayTest {

    ProcessEngine defaultProcessEngine;

    @Before
    public void init() {
        defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
    }

    /**
     * 部署流程定义
     */
    @Test
    public void deployment(){
        RepositoryService repositoryService = defaultProcessEngine.getRepositoryService();

        Deployment deploy = repositoryService.createDeployment()
                .addClasspathResource("pic/gateway/holidayGateway1.bpmn")
                .addClasspathResource("pic/gateway/holidayGateway1.png")
                .name("请假流程")
                .deploy();

        System.out.println(deploy);
    }

    /**
     * 启动流程实例
     */
    @Test
    public void startProcessInstance(){

        RuntimeService runtimeService = defaultProcessEngine.getRuntimeService();

        Map<String,Object> map = new HashMap<>();

        Holiday holiday = new Holiday();
        holiday.setNum(5F);

        map.put("holiday",holiday);

        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess_1", map);

        System.out.println(processInstance);

    }

    /**
     * 提交任务
     */
    @Test
    public void completTask(){
        String assignee = "lisi";
        Task task = querySingResultByAssignee(assignee);
        TaskService taskService = defaultProcessEngine.getTaskService();
        taskService.complete(task.getId());
    }

    /**
     * 查询用户唯一任务
     * @param assignee
     * @return
     */
    public Task querySingResultByAssignee(String assignee){
        TaskService taskService = defaultProcessEngine.getTaskService();
        return taskService.createTaskQuery().processDefinitionKey("myProcess_1").taskAssignee(assignee).singleResult();
    }
}
复制代码

提交完部门经理审批后因为两个判断都成立,于是走ID号小的流程,只会走一个

当多个条件同时成立的时候,会选择ID最小的一个流程走,当条件都不成立的时候,排他网关也没招,只能报错

作者:彼岸舞

时间:2020\09\07

内容关于:Activiti工作流

本文来源于网络,只做技术分享,一概不负任何责任

posted @   彼岸舞  阅读(1677)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
点击右上角即可分享
微信分享提示