2023最新版本Activiti7系列-网关服务

2023-10-27

在这里插入图片描述

网关篇

  网关可控制流程的执行流向,常用于拆分或合并复杂的流程场景。在Activiti7中,有以下几种类型的网关:

  1. 排他网关(Exclusive Gateway):用于在流程中进行条件判断,根据不同的条件选择不同的分支路径。只有满足条件的分支会被执行,其他分支会被忽略。

  2. 并行网关(Parallel Gateway):用于将流程分成多个并行的分支,这些分支可以同时执行。当所有分支都执行完毕后,流程会继续向下执行。

  3. 包容网关(Inclusive Gateway):用于根据多个条件的组合情况选择分支路径。可以选择满足任意一个条件的分支执行,或者选择满足所有条件的分支执行。

  4. 事件网关(Event Gateway):用于根据事件的触发选择分支路径。当指定的事件触发时,流程会选择对应的分支执行。

  这些网关可以根据实际需求灵活地组合使用,以实现不同的流程控制逻辑。Activiti7提供了直观的图形化界面,用户可以通过拖拽和连接网关来定义流程的分支和合并。同时,Activiti7还提供了丰富的API和扩展点,方便开发人员进行二次开发和定制。接下来我们分别介绍下各种网关的应用。

1.排他网关

排他网关(exclusive gateway)(也叫异或网关 XOR gateway,或者更专业的,基于数据的排他网关 exclusive data-based gateway),用于对流程中的决策建模。当执行到达这个网关时,会按照所有出口顺序流定义的顺序对它们进行计算。选择第一个条件计算为true的顺序流(当没有设置条件时,认为顺序流为true)继续流程。

  排他网关用内部带有’X’图标的标准网关(菱形)表示,'X’图标代表异或的含义。请注意内部没有图标的网关默认为排他网关。BPMN 2.0规范不允许在同一个流程中混合使用有及没有X的菱形标志。

在这里插入图片描述

然后需要添加对应的排他网关的流转条件

在这里插入图片描述

案例代码

/**
     * 流程部署操作
     */
    @Test
    public void test1(){
        // 1.获取ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        // 2.完成流程的部署操作 需要通过RepositoryService来完成
        RepositoryService repositoryService = processEngine.getRepositoryService();
        // 3.完成部署操作
        Deployment deploy = repositoryService.createDeployment()
                .addClasspathResource("flow/gateway1.bpmn20.xml")
                .name("排他网关")
                .deploy(); // 是一个流程部署的行为 可以部署多个流程定义的
        System.out.println(deploy.getId());
        System.out.println(deploy.getName());
    }

    /**
     * 发起一个流程
     */
    @Test
    public void test3(){
        ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
        // 发起流程 需要通过 runtimeService来实现
        RuntimeService runtimeService = engine.getRuntimeService();
        // 通过流程定义ID来启动流程  返回的是流程实例对象
        ProcessInstance processInstance = runtimeService
                .startProcessInstanceById("gateway1:1:3");
        System.out.println("processInstance.getId() = " + processInstance.getId());
        System.out.println("processInstance.getDeploymentId() = " + processInstance.getDeploymentId());
        System.out.println("processInstance.getDescription() = " + processInstance.getDescription());
    }

    /**
     * 任务审批
     */
    @Test
    public void test4(){
        ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = engine.getTaskService();
        List<Task> list = taskService.createTaskQuery().taskAssignee("张三").list();
        Map<String,Object> map = new HashMap<>();
        // 绑定对应的请假天数
        map.put("days",1);
        for (Task task : list) {
            taskService.complete(task.getId(),map);
        }
    }

2.并行网关

  并行网关允许将流程分成多条分支,也可以把多条分支汇聚到一起,并行网关的功能是基于进入和外出顺序流的:

fork分支:并行后的所有外出顺序流,为每个顺序流都创建一个并发分支。

join汇聚: 所有到达并行网关,在此等待的进入分支, 直到所有进入顺序流的分支都到达以后, 流程就会通过汇聚网关。

注意,如果同一个并行网关有多个进入和多个外出顺序流, 它就同时具有分支和汇聚功能。 这时,网关会先汇聚所有进入的顺序流,然后再切分成多个并行分支。

  与其他网关的主要区别是,并行网关不会解析条件。 即使顺序流中定义了条件,也会被忽略。

在这里插入图片描述

案例代码

   /**
     * 流程部署操作
     */
    @Test
    public void test1(){
        // 1.获取ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        // 2.完成流程的部署操作 需要通过RepositoryService来完成
        RepositoryService repositoryService = processEngine.getRepositoryService();
        // 3.完成部署操作
        Deployment deploy = repositoryService.createDeployment()
                .addClasspathResource("flow/gateway2.bpmn20.xml")
                .name("排他网关")
                .deploy(); // 是一个流程部署的行为 可以部署多个流程定义的
        System.out.println(deploy.getId());
        System.out.println(deploy.getName());
    }

    /**
     * 发起一个流程
     */
    @Test
    public void test3(){
        ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
        // 发起流程 需要通过 runtimeService来实现
        RuntimeService runtimeService = engine.getRuntimeService();
        // 通过流程定义ID来启动流程  返回的是流程实例对象
        ProcessInstance processInstance = runtimeService
                .startProcessInstanceById("gateway2:1:17503");
        System.out.println("processInstance.getId() = " + processInstance.getId());
        System.out.println("processInstance.getDeploymentId() = " + processInstance.getDeploymentId());
        System.out.println("processInstance.getDescription() = " + processInstance.getDescription());
    }

    /**
     * 任务审批
     */
    @Test
    public void test4(){
        ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = engine.getTaskService();
        List<Task> list = taskService.createTaskQuery().taskAssignee("boss").list();
        for (Task task : list) {
            taskService.complete(task.getId());
        }
    }

在并行网关中我们需要注意的是执行实例的概念。

  • 主流程实例:流程启动就会维护的一条记录,ACT_RU_EXECUTIONparent_id_为null的记录
  • 子流程实例:流程的每一步操作。都会更新子流程实例,表示当前流程的执行进度。如果进入的是并行网关。案例中的网关会产生3个子流程实例和一个主流程实例。

在这里插入图片描述

3.包容网关

  包含网关可以看做是排他网关和并行网关的结合体。 和排他网关一样,你可以在外出顺序流上定义条件,包含网关会解析它们。 但是主要的区别是包含网关可以选择多于一条顺序流,这和并行网关一样。

  包含网关的功能是基于进入和外出顺序流的:

分支: 所有外出顺序流的条件都会被解析,结果为true的顺序流会以并行方式继续执行, 会为每个顺序流创建一个分支。

汇聚:所有并行分支到达包含网关,会进入等待状态, 直到每个包含流程token的进入顺序流的分支都到达。 这是与并行网关的最大不同。换句话说,包含网关只会等待被选中执行了的进入顺序流。 在汇聚之后,流程会穿过包含网关继续执行。

在这里插入图片描述

    /**
     * 流程部署操作
     */
    @Test
    public void test1(){
        // 1.获取ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        // 2.完成流程的部署操作 需要通过RepositoryService来完成
        RepositoryService repositoryService = processEngine.getRepositoryService();
        // 3.完成部署操作
        Deployment deploy = repositoryService.createDeployment()
                .addClasspathResource("flow/gateway3.bpmn20.xml")
                .name("排他网关")
                .deploy(); // 是一个流程部署的行为 可以部署多个流程定义的
        System.out.println(deploy.getId());
        System.out.println(deploy.getName());
    }

    /**
     * 发起一个流程
     */
    @Test
    public void test3(){
        ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
        // 发起流程 需要通过 runtimeService来实现
        RuntimeService runtimeService = engine.getRuntimeService();
        // 通过流程定义ID来启动流程  返回的是流程实例对象
        ProcessInstance processInstance = runtimeService
                .startProcessInstanceById("gateway3:1:35003");
        System.out.println("processInstance.getId() = " + processInstance.getId());
        System.out.println("processInstance.getDeploymentId() = " + processInstance.getDeploymentId());
        System.out.println("processInstance.getDescription() = " + processInstance.getDescription());
    }

    /**
     * 任务审批
     */
    @Test
    public void test4(){
        ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = engine.getTaskService();
        List<Task> list = taskService.createTaskQuery().taskAssignee("boss").list();
        Map<String,Object> map = new HashMap<>();
        map.put("days",5);
        for (Task task : list) {
            taskService.complete(task.getId(),map);
        }
    }

4.事件网关

  事件网关允许根据事件判断流向。网关的每个外出顺序流都要连接到一个中间捕获事件。 当流程到达一个基于事件网关,网关会进入等待状态:会暂停执行。与此同时,会为每个外出顺序流创建相对的事件订阅。

事件网关的外出顺序流和普通顺序流不同,这些顺序流不会真的"执行", 相反它们让流程引擎去决定执行到事件网关的流程需要订阅哪些事件。 要考虑以下条件:

事件网关必须有两条或以上外出顺序流;
事件网关后,只能使用intermediateCatchEvent类型(activiti不支持基于事件网关后连接ReceiveTask)
连接到事件网关的中间捕获事件必须只有一个入口顺序流。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2023最新版本Activiti7系列-网关服务 的相关文章

随机推荐

  • Android小项目集合100多个

    是学习和联系Android小项目的使用资料 排名完全是根据 GitHub 搜索 Java 语言选择 Best Match 得到的结果 然后过滤了跟 Android 不相关的项目 所以排名并不具备任何官方效力 仅供参考学习 方便初学者快速了解
  • C++11 promise

    目录 一 promise 二 定义 三 成员函数 四 get future 五 设置结果 1 set value 2 set value at thread exit 3 set exception 4 set exception at t
  • java消费者接口应用_几个常用的Java接口之Consumer、Supplier、Predicate和Function

    Java8之Consumer Supplier Predicate和Function攻略 来聊聊Consumer Supplier Predicate Function这几个接口的用法 在 Java8 的用法当中 这几个接口虽然没有明目张胆
  • 嵌入式(文件属性、目录操作)

    打开目录 include
  • 【目标检测】基于yolov5的火灾烟雾检测和识别(附代码和数据集)

    写在前面 首先感谢兄弟们的订阅 让我有创作的动力 在创作过程我会尽最大能力 保证作品的质量 如果有问题 可以私信我 让我们携手共进 共创辉煌 文末附项目代码和数据集 请看检测效果 1 介绍 火灾烟雾检测和识别是指通过计算机视觉技术 对火灾现
  • 设计模式(UML类图)

    UML 基本介绍 UML Unified modeling language UML 统一建模语言 是一种用于软件系统分析和设计的语言工具 它用于帮助软件开发人员进行思考和记录思路的结果 UML 本身是一套符号的规定 就像数学符号和化学符号
  • Java高阶面试问答-分布式

    理论 CAP原则又称CAP定理 指的是在一个分布式系统中 Consistency 一致性 Availability 可用性 Partition tolerance 分区容错性 三者不可兼得 一致性 C 对某个指定的客户端来说 读操作能返回最
  • git:git的使用资料(一)

    1 什么是git git是一个分布式的版本控制软件 为什么要做版本控制 要保留之前所有的版本 以便回滚和修改 中心有很多例如github 码云 csdn等 2 安装git 我以win10为例 官网下载应用程序点击此处下载 双击运行 一直点击
  • char显示为4个字节

    char显示为4个字节 问题描述 问题解决 问题分析 问题描述 读取bmp图像长宽 用char型数组存储 但是读出来的却不是预期的1个字节的值 而是4个字节的 数组是有初始化的 问题解决 强转为unsinged char处理 正常 问题分析
  • 0欧姆电阻能流过无穷大电流吗

    电阻有插件电阻和贴片电阻 电阻的功率P II R 那么有的同学就要问了 我们0R的电阻是不是可以流过无穷打的电流呢 答案是否定的 其实我们可以在电阻的规格书上找到答案 我以普通贴片电阻为例 大家可以看下贴片电阻数据手册中标有jumper这个
  • JetBrains CLion/IDEA/PyCharm字体、Tab退四格、编译器和解释器设置

    文章目录 CLion设置代码字体大小 设置Tab键退四格 安装cygwin编译器 设置project编译器 IDEA设置代码字体大小 设置Tab键退四格 设置project解释器 project添加第三方jar包 PyCharm设置代码字体
  • Apache

    看到这个有没有想到阿帕奇 武装直升机 显然他不是呀 下面让我们一起了解一下Apache吧 一 概述 Apache是一个开源的 多平台 可扩展的Web服务器软件 它由Apache软件基金会开发和维护 目前是互联网上使用最广泛的Web服务器软件
  • 多台群晖实现按计划WOL网络自动唤醒数据冷备份

    几年前买了2盘位的DS218 但是随着照片的增加已经不够用 年中购入了4盘位的群晖DS923 2块16T西数数企业级硬盘 1块2T intel企业级 SSD 1 什么是冷备份 冷备是离线备份 备份好的数据可以单独存取 定期冷备可以保证数据安
  • 浅谈初次做外包项目及背后的思考

    谈起外包经历 我的第一次外包源自前两年某天陪着女友逛商场时 接到一个朋友的电话 朋友兴高采烈地跟我介绍一个大项目 需求不多 钱不少 难度不大 口气不小 我一听心动了 原以为要赚一笔 easy money 后面再看看 这次外包踩了大大小小不少
  • 手撕哈希表(HashTable)——C++高阶数据结构详解

    目录 传统艺能 概念 哈希碰撞 哈希函数 解决哈希冲突 闭散列 开散列 闭散列实现 数据插入 数据查找 数据删除 开散列实现 插入数据 查找数据 数据删除 利用素数来规定哈希表大小 实现方案 传统艺能 小编是双非本科大一菜鸟不赘述 欢迎米娜
  • 镜头选型——景深计算

    正在上传 重新上传取消 1 概述 先看两个例子 拍摄花 昆虫等照片时 背景拍的比较模糊 突出被拍物 但当拍摄纪念照 风景等照片时 却会把背景拍摄得和被拍对象一样清晰 这两者就是不同景深 前者为浅景深 拍摄聚焦到被拍物上 只能拍清一小段距离
  • JavaScript let 和 const

    在JavaScript中 let 和 const 是用于声明变量的关键字 let 关键字用于声明一个块级作用域的变量 块级作用域是指在一个代码块 通常是在花括号 内部 中声明的变量只在该代码块内部有效 例如 javascript funct
  • MATLAB使用Simulink 进行建模与仿真方法 - Simulink基本操作与入门教程

    Simulink 是 MATLAB 很强大的功能组件 广泛用于系统建模 仿真和分析 下面分享给大家MATLAB使用Simulink 进行建模与仿真方法 步骤 希望能够帮助大家 1 工具 原料 电脑 MATLAB及Simulink 组件 MA
  • 对于产业互联网参与者来讲,只需要重构穿传统意义上的生产关系即可

    消费互联网模式的固定思维 让玩家们想当然地认为 所谓的产业互联网 仅仅只是一种重构生产关系的过程 对于产业互联网的玩家们来讲 他们只需要重构穿传统意义上的生产关系即可 正是在这样一种思维的影响之下 我们才看到了以新零售为代表的诸多看似新物种
  • 2023最新版本Activiti7系列-网关服务

    网关篇 网关可控制流程的执行流向 常用于拆分或合并复杂的流程场景 在Activiti7中 有以下几种类型的网关 排他网关 Exclusive Gateway 用于在流程中进行条件判断 根据不同的条件选择不同的分支路径 只有满足条件的分支会被