activiti学习之并行网关

2023-10-27

写在前面

并行网关用于处理流程并发的场景,可以将流程分发到多个执行流程,也可以让多个执行流程合并为一个执行流(但不是必须一起使用),也就是说并行网关有两种行为,分叉和合并。下面我们来一起看下。

场景:学生请假同时由班长和班主任审批,等到班长和班主任都审批完成后,由校长审批,通过这个场景来演示其使用。

1:测试

1.1:流程设计

  • 效果图

在这里插入图片描述

  • xml
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test">
    <process id="csdnParallelGateway" name="csdnParallelGateway" isExecutable="true">
        <parallelGateway id="parallelgateway1" name="Parallel Gateway"></parallelGateway>
        <userTask id="usertask1" name="班长审批" activiti:assignee="班长">
            <extensionElements>
                <modeler:initiator-can-complete xmlns:modeler="http://activiti.com/modeler">false</modeler:initiator-can-complete>
            </extensionElements>
        </userTask>
        <userTask id="usertask2" name="班主任审批" activiti:assignee="班主任">
            <extensionElements>
                <modeler:initiator-can-complete xmlns:modeler="http://activiti.com/modeler">false</modeler:initiator-can-complete>
            </extensionElements>
        </userTask>
        <startEvent id="startevent1" name="Start"></startEvent>
        <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="parallelgateway1"></sequenceFlow>
        <sequenceFlow id="flow2" sourceRef="parallelgateway1" targetRef="usertask1"></sequenceFlow>
        <sequenceFlow id="flow3" sourceRef="parallelgateway1" targetRef="usertask2"></sequenceFlow>
        <parallelGateway id="parallelgateway2" name="Parallel Gateway"></parallelGateway>
        <sequenceFlow id="flow4" sourceRef="usertask1" targetRef="parallelgateway2"></sequenceFlow>
        <sequenceFlow id="flow5" sourceRef="usertask2" targetRef="parallelgateway2"></sequenceFlow>
        <userTask id="usertask3" name="校长审批" activiti:assignee="校长">
            <extensionElements>
                <modeler:initiator-can-complete xmlns:modeler="http://activiti.com/modeler">false</modeler:initiator-can-complete>
            </extensionElements>
        </userTask>
        <sequenceFlow id="flow6" sourceRef="parallelgateway2" targetRef="usertask3"></sequenceFlow>
        <endEvent id="endevent1" name="End"></endEvent>
        <sequenceFlow id="flow7" sourceRef="usertask3" targetRef="endevent1"></sequenceFlow>
    </process>
    <bpmndi:BPMNDiagram id="BPMNDiagram_csdnParallelGateway">
        <bpmndi:BPMNPlane bpmnElement="csdnParallelGateway" id="BPMNPlane_csdnParallelGateway">
            <bpmndi:BPMNShape bpmnElement="parallelgateway1" id="BPMNShape_parallelgateway1">
                <omgdc:Bounds height="40.0" width="40.0" x="250.0" y="290.0"></omgdc:Bounds>
            </bpmndi:BPMNShape>
            <bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1">
                <omgdc:Bounds height="55.0" width="105.0" x="380.0" y="190.0"></omgdc:Bounds>
            </bpmndi:BPMNShape>
            <bpmndi:BPMNShape bpmnElement="usertask2" id="BPMNShape_usertask2">
                <omgdc:Bounds height="55.0" width="105.0" x="380.0" y="360.0"></omgdc:Bounds>
            </bpmndi:BPMNShape>
            <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
                <omgdc:Bounds height="35.0" width="35.0" x="80.0" y="290.0"></omgdc:Bounds>
            </bpmndi:BPMNShape>
            <bpmndi:BPMNShape bpmnElement="parallelgateway2" id="BPMNShape_parallelgateway2">
                <omgdc:Bounds height="40.0" width="40.0" x="580.0" y="290.0"></omgdc:Bounds>
            </bpmndi:BPMNShape>
            <bpmndi:BPMNShape bpmnElement="usertask3" id="BPMNShape_usertask3">
                <omgdc:Bounds height="55.0" width="105.0" x="720.0" y="280.0"></omgdc:Bounds>
            </bpmndi:BPMNShape>
            <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
                <omgdc:Bounds height="35.0" width="35.0" x="930.0" y="290.0"></omgdc:Bounds>
            </bpmndi:BPMNShape>
            <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
                <omgdi:waypoint x="115.0" y="307.0"></omgdi:waypoint>
                <omgdi:waypoint x="250.0" y="310.0"></omgdi:waypoint>
            </bpmndi:BPMNEdge>
            <bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
                <omgdi:waypoint x="270.0" y="290.0"></omgdi:waypoint>
                <omgdi:waypoint x="270.0" y="217.0"></omgdi:waypoint>
                <omgdi:waypoint x="380.0" y="217.0"></omgdi:waypoint>
            </bpmndi:BPMNEdge>
            <bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3">
                <omgdi:waypoint x="270.0" y="330.0"></omgdi:waypoint>
                <omgdi:waypoint x="270.0" y="387.0"></omgdi:waypoint>
                <omgdi:waypoint x="380.0" y="387.0"></omgdi:waypoint>
            </bpmndi:BPMNEdge>
            <bpmndi:BPMNEdge bpmnElement="flow4" id="BPMNEdge_flow4">
                <omgdi:waypoint x="485.0" y="217.0"></omgdi:waypoint>
                <omgdi:waypoint x="599.0" y="217.0"></omgdi:waypoint>
                <omgdi:waypoint x="600.0" y="290.0"></omgdi:waypoint>
            </bpmndi:BPMNEdge>
            <bpmndi:BPMNEdge bpmnElement="flow5" id="BPMNEdge_flow5">
                <omgdi:waypoint x="485.0" y="387.0"></omgdi:waypoint>
                <omgdi:waypoint x="600.0" y="387.0"></omgdi:waypoint>
                <omgdi:waypoint x="600.0" y="330.0"></omgdi:waypoint>
            </bpmndi:BPMNEdge>
            <bpmndi:BPMNEdge bpmnElement="flow6" id="BPMNEdge_flow6">
                <omgdi:waypoint x="620.0" y="310.0"></omgdi:waypoint>
                <omgdi:waypoint x="720.0" y="307.0"></omgdi:waypoint>
            </bpmndi:BPMNEdge>
            <bpmndi:BPMNEdge bpmnElement="flow7" id="BPMNEdge_flow7">
                <omgdi:waypoint x="825.0" y="307.0"></omgdi:waypoint>
                <omgdi:waypoint x="930.0" y="307.0"></omgdi:waypoint>
            </bpmndi:BPMNEdge>
        </bpmndi:BPMNPlane>
    </bpmndi:BPMNDiagram>
</definitions>

1.2:部署流程

/**
 * 部署流程定义
 */
@Test
public void deploy() {
    Deployment deployment = repositoryService.createDeployment() // 创建部署
            .addClasspathResource("com/jh/activiti/csdnParallelGateway.bpmn20.xml") // 加载流程资源文件
            .name("csdn并行网关测试") // 流程名称
            .deploy(); // 部署
    System.out.println("流程部署ID:" + deployment.getId());
    System.out.println("流程部署Name:" + deployment.getName());
}
  • 部署信息

在这里插入图片描述

  • 流程定义信息

在这里插入图片描述

1.3:创建流程实例

// csdnParallelGateway
@Test
public void startInstance() {
    runtimeService.startProcessInstanceByKey("csdnParallelGateway");
}
  • 流程实例

在这里插入图片描述

  • 通过并行网关生成的任务

在这里插入图片描述

1.4:完成任务

  • 完成班长审批

这里先完成班长审批,还是先完成办主任审批没有区别,都是在二人完成审批后流转到校长审批节点。

@Test
public void complete() {
    taskService.complete("917512");
}

完成后,如下图:

在这里插入图片描述

  • 完成班主任审批
@Test
public void complete() {
    taskService.complete("917515");
}

在这里插入图片描述
完成后,会流转到校长审批节点,生成校长审批的任务。

如果是继续完成校长审批任务流程就自动结束了,这里不再测试,感兴趣的可以自己尝试下。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

activiti学习之并行网关 的相关文章

  • 使用activiti总结--发布,办理,查询

    接上一篇文章 xff0c 使用创建好的流程图 xff0c 总结一下activiti发布到查询使用的方法和测试代码 流程图 1 引用配置文件 activiti cfg xml xff0c 不引用或者引用失败的话在创建流引擎的时候会报空指针异常
  • 5.1 activiti执行监听器ExecutionListener

    1 执行监听器的使用场景 1 1 人员动态分配 节点审批人员需要在流程运行过程中动态分配 当前任务节点完成的时候 指定需要指定下一个节点的处理人 比如 一个请假流程 a员工请假 需要指定下一步需要处理请假流程的领导 1 2 任务节点调取业务
  • activiti-serviceTask(服务任务)

    Activiti服务任务 serviceTask Activiti服务任务 serviceTask 作者 邓家海 都有一段沉默的时间 等待厚积薄发 应用场景 当客户有这么一个需求 下一个任务我需要自动执行一些操作 并且这个节点不需要任何的人
  • SpringBoot整合activiti5-流程部署

    系列文章目录 springboot整合activiti5 在Activiti中 定义了多种资源 其中 bpmn和 bpmn20 xml都是流程定义文件 这两种格式都可以被系统识别并进行解释 但是目前最新版本的Activiti Designe
  • Activiti7 监听器【十四】

    Activiti 7系列文章目录 文章代码下载 Activiti7 工作流设计器 一 Activiti7 创建表 二 Activiti7 表结构介绍 三 Activiti7 设计器创建流程 四 Activiti7 部署流程 五 Activi
  • Activiti和tk.mybatis的坑

    近期开发关于工作流的项目 遇到一个很坑的问题 activiti和tk mybatis居然会有冲突 先看异常 报错的原因大概就算这句话 Parameter 1 of method springProcessEngineConfiguratio
  • Activiti6.0学习实践(1)-基础和部署

    工作流是现在信息化建设过程中经常用于解决业务流程管理问题的工具 因此工作流是一个比较专业化的话题 当前流行的工作流主要有JBPM和activiti 本系列学习实践的目的就是掌握activiti的部署 开发和应用 重要说明 本系列学习实践都是
  • Springboot 项目搭建activiti流程项目demo

    Springboot 项目搭建activiti流程项目demo 首先在pom文件中添加依赖
  • 5.2 activiti任务监听器TaskListener

    1 任务监听器定义 任务监听器用于在特定的任务相关事件发生时 执行自定义的Java逻辑或表达式 2 监听器监听的事件 String EVENTNAME CREATE create 创建 当任务已经创建 并且所有任务参数都已经设置时触发 St
  • 【activiti 入门】springboot 集成activiti6.0的demo

    环境 jdk 1 8 maven 3 0 IDEA插件之actiBPM springboot2 0 activiti6 0 mysql数据库 具体demo地址 https download csdn net download qq 3333
  • 2023最新版本Activiti7系列-源码篇-初始化过程

    源码分析 1 设计模式 1 1 命令模式 https dpb bobokaoya sm blog csdn net article details 89115420 1 2 责任链模式 https dpb bobokaoya sm blog
  • Activiti 架构分析

    Activiti是业界很流行的java工作流引擎 关于Activiti与JBPM5的关系和如何选择不是本文要讨论的话题 相关内容可以baidu一下 Activiti从架构角度看是比较优秀的 是很面向对象的 是我所阅读过的代码结构很棒的开源软
  • Activiti启动流程实例,runtimeService.startProcessInstanceByKey

    启动流程实例 添加进businessKey 本质 act ru execution表中的businessKey的字段要存入业务标识 public class BusinessKeyAdd public static void main St
  • activiti7-1-环境准备(idea)

    activiti7环境准备 1 首先安装插件 2 然后建库 3 pom 4 配置文件 4 1 log4j properties 4 2 activiti cfg xml 5 测试类生成表 6 目录结构 7 最后的操作 务必看一看 又回到cs
  • 逐步寻找 Activiti Alfresco Workflow 教程 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我在哪里可以找到 Activiti Alfresco 工作流程 尤其是自定义工作流程 的简单教程 我是 Alfresco Activiti Worf
  • Spring新事务与Retryable相结合

    如果我有一个方法 对于某个异常有 Spring 可重试 并且还有一个 Transactional Requires new 那么每次重试完成时 它会创建一个新事务还是使用现有事务 ie Retryable maxAttempts 5 bac
  • 【工作流Activiti】了解工作流

    1 什么是工作流 工作流 Workflow 就是通过计算机对业务流程自动化执行管理 它主要解决的是 使在多个参与者之间按照某种预定义的规则自动进行传递文档 信息或任务的过程 从而实现某个预期的业务目标 或者促使此目标的实现 通俗来讲 就是业
  • Activiti 6.0.0 完成任务时无法获取表单属性

    我是 Activiti 6 0 0 的新手 我创建了一个包含用户任务的进程 第二个用户任务有两个表单属性 但是当我完成第一个用户任务并尝试完成第二个用户任务时 表单属性不显示 我无法完成用户任务 下面是我的 bpm 流程
  • 开源 BPM 工具(如 Activiti、bonita)和 Windows Workflow Foundation 之间有什么区别

    我试图找到一个基于asp net的免费开源BPM工具 但不幸的是我没有找到这样的工具 但最近我读到一篇关于Windows Workflow Foundation的文章 那么它是否提供了类似于开源BPM工具如Activiti bonita J
  • 如何获取控制器中流程实例的ID?

    我的环境 Alfresco Share v5 2 d r134641 b15 Aikau 1 0 101 3 Spring Surf 5 2 d Spring WebScripts 6 13 Freemarker 2 3 20 alfres

随机推荐

  • oracle11g 导出表报EXP-00011:table不存在。

    转自 https blog csdn net mingzaiwang article details 52608991 depth 1 utm source distribute pc relevant none task utm sour
  • 8种提升程序猿编程能力的方法+编程思维四个核心:分解、抽象、模式识别和算法

    8种提升程序猿编程能力的方法 对于程序员来说 提高自己的编程能力 算是给自己定的职业发展目标之一 不过定一个成为编程大神的目标很容易 具体做起来可能就不是一件简单的事了 首先 既然决定 我要变得更好 得先知道 更好 是什么样子的 另外 不能
  • C++ 单链表节点交换

    这里提供两种方法 一种是只交换对应的数据 另一种是通过更改指针来交换节点 而更改指针中又可以分为新建节点与不新建节点的方法 1 不更改指针 这个没啥好说的 直接将对应的data交换即可 这里的a c节点都为被交换节点的上一个节点 因为不更改
  • el-form之表单校验自动定位到报错位置

    1 背景 表单校验大多数的表单都会用到 一般情况下只是提示当前哪些项校验不通过 但是如果表单比较需要用户自己去找是哪项校验不通过 这样的用户体验不太好 如果能自动定位到当前校验不通过的表单项体验会更好一些 这里是以elementui 的 e
  • 主线剧情-番外02-设备树详解

    设备树详解 本文 续接 主线剧情03 NXP i MX 系列 u boot 移植基础详解 一文中移植过程小节中有关设备树的内容 编辑整理 By Staok 如有错误恭谢指出 侵删 CC BY NC SA 4 0 注意 本文适合学习设备树的一
  • Spring参数校验和全局异常处理

    目录 一 前言 二 Validation 1 JSR 303 2 Spring Validation 3 Validated和 Valid的区别 三 全局异常处理 1 为何要处理异常 2 RestControllerAdvice 3 返回自
  • Vue项目启动报错:error:cannot find module xxx

    原因 无法找到项目依赖的某个模块 解决办法 1 删掉存放模块的文件夹node module 2 执行清除缓存命令 npm cache clean 如果报错 使用强制清除npm cache clean force 如果还报错 删除packag
  • Unity滑入Button/按键/UI范围检测

    效果展示 鼠标滑入按键的点击范围后 对应的游戏背景会发生改变 将下面的脚本挂在需要检测的UI上即可 记得引用必要的操作 using System Collections using System Collections Generic us
  • 接口测试初认知

    接口测试初认知 一 概念 根据分层自动化测试中的定义 最底层由开发人员编写的单元测试保证代码质量 最上层由功能测试人员手工 UI自动化进行大量的自动化功能测试保证功能的可用 则中间层的接口测试是什么作用呢 接下里我们就学习接口测试 那说到接
  • matplotlib如何降低x轴密度-时间显示问题

    python中轴数据的 稀释 在python中很多时候都会遇到x轴数据过多而显示出问题的问题 因此这篇文章针对于时间显示问题来做出解答 可以到到原始数据是 可以先简单绘制数据图 代码如下 绘制结果图如下 结果无法显示出日期 因此需要导入ti
  • C++压缩解压开源库ZIP

    1 ZIP下载 ZIP 主要是用于简单的压缩和解压 引入比较方便 而且极其易使用 方便用户操作 下载地址 http www codeproject com Articles 7530 Zip Utils clean elegant simp
  • 软连接文件的创建删除

    demo 通过系统命令 实现一个对视频文件可以操作的软连接路径 在Nginx中的HTML页面可直接访问视频文件 目录的创建 文件的链接 文件的删除 include
  • DA14585-我手上的开发板(串口2)

    名字 DA14585 Development Kit Pro DA14585 Development Kit Pro Dialog视频 DA14585 Development Kit Pro Dialog 文件结构参考 DA14585 SD
  • 百度OCR文字识别及使用案例

    百度OCR文字识别使用案例 案例环境 Windows10 Jdk1 8 IDEA2019 3 5旗舰版 一 账号注册及创建应用 1 访问地址 https ai baidu com tech ocr general track cp aipi
  • —————数组循环之终极宝典

    一 数组循环的方法 for forEach map for of filter every find 1 for循环 最基础的循环方式 速度较快 效率较高 而且可以控制数组的任意一项元素 const arr 1 2 3 4 5 for le
  • Java并发编程:线程池的使用

    https www cnblogs com dolphin0520 p 3932921 html Java并发编程 线程池的使用 在前面的文章中 我们使用线程的时候就去创建一个线程 这样实现起来非常简便 但是就会有一个问题 如果并发的线程数
  • 堆排序(Heap Sort)实现

    定义 堆排序 英语 Heapsort 是指利用堆 heap 这种数据结构所设计的一种排序算法 堆是一个近似完全二叉树的结构 并同时满足堆积的性质 即子节点的键值或索引总是小于 或者大于 它的父节点 堆可看作是一个 完全二叉树 的结构 记一个
  • sqli-labs(27a)

    0X01测试闭合 id 1 报错 id 1 正常 0X02构造语句爆数据库名称 id 99 0AUNIon 0ASELECt 0A1 database 3 1 1 和27关一样 只是 变成了 其他语法就是打组合拳 0X03组合拳 27关见
  • python 设置x轴_python matplotlib坐标轴设置的方法

    在使用matplotlib模块时画坐标图时 往往需要对坐标轴设置很多参数 这些参数包括横纵坐标轴范围 坐标轴刻度大小 坐标轴名称等 在matplotlib中包含了很多函数 用来对这些参数进行设置 我们可以对坐标轴进行设置 设置坐标轴的范围
  • activiti学习之并行网关

    写在前面 并行网关用于处理流程并发的场景 可以将流程分发到多个执行流程 也可以让多个执行流程合并为一个执行流 但不是必须一起使用 也就是说并行网关有两种行为 分叉和合并 下面我们来一起看下 场景 学生请假同时由班长和班主任审批 等到班长和班