BPMN2.0中的顺序流、网关和子流程

2023-11-23 01:18

本文主要是介绍BPMN2.0中的顺序流、网关和子流程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一、顺序流与网关

1. 顺序流

2. 网关

2.1 单一网关顺序流实例

2.2 并行网关实例

2.3 包容性网关实例

2.4 支持事件网关实例

二、子流程

1. 子流程

2. 事件子流程


一、顺序流与网关

1. 顺序流

备注: 一般情况下只有一条直线加一个箭头

2. 网关

  • 单一网关(Exclusive Gateway):一条路走下去

  • 并行网关(Parallel Gateway):多条路可以同时走下去

  • 包容性网关(Inclusive Gateway):继支持多条路同时走也支持条件表达式

  • 基于事件网关(Event-based Gateway):等待事件触发,一个事件触发了其他事件都会失效

2.1 单一网关顺序流实例

   备注:前两条为条件顺序流,第三条为默认顺序流

   单一网关特点: 分支判断、只能选一、支持默认

 单一网关测试代码实现:

public class GatewayTest {private static final Logger LOGGER = LoggerFactory.getLogger(GatewayTest.class);@Rulepublic ActivitiRule activitiRule = new ActivitiRule();@Test@Deployment(resources = "my-process-exclusiveGateway1.bpmn20.xml")public void test(){Map<String, Object> variables = new HashMap<>();variables.put("score", 70);ProcessInstance processInstance = activitiRule.getRuntimeService().startProcessInstanceByKey("my-process", variables);Task task = activitiRule.getTaskService().createTaskQuery().singleResult();LOGGER.info("task.name = {}",task.getName());}
}

 测试效果:

2.2 并行网关实例

并发网关的特点:流程并发、分支、合并、忽略条件、非对称

并行网关测试代码实现:

@Test
@Deployment(resources = "my-process-parallelGateway1.bpmn20.xml")
public void parallelTest(){ProcessInstance processInstance = activitiRule.getRuntimeService().startProcessInstanceByKey("my-process");List<Task> tasks = activitiRule.getTaskService().createTaskQuery().processInstanceId(processInstance.getId()).listPage(0, 100);for(Task task : tasks){LOGGER.info("task.name = {}",task.getName());activitiRule.getTaskService().complete(task.getId());}LOGGER.info("tasks.size = {}", tasks.size());Task task = activitiRule.getTaskService().createTaskQuery().singleResult();LOGGER.info("task.name = {}", task.getName());
}

测试效果:

2.3 包容性网关实例

包容性网关的特点:支持并发、分支、合并、支持条件、非对称

2.4 支持事件网关实例

以哪个事件先发生为准:比如信号事件和定时任务,在10分钟的定时内,如果信号事件先发生,则先执行信号任务,并清理其他事件。

包容性网关的特点:流程暂停、事件订阅、捕获事件、单一执行

二、子流程

1. 子流程

Activiti中的子流程分两种:Sub-Process and Call Activities

子流程分类:

  • 子流程(Sub-Process)

  • 事件子流程(Event Sub-Process)

  • 事物子流程(Transaction Sub-Process)

  • 调用式子流程(Call Activiti)

子流程图示

子流程实例

子流程中:共性的东西可以拿出来共同处理,比如异常处理等;子流程与其他流程有流程边界。

 注:子过程抛出的事件都可以在边界中捕获。

子流程特点:分层建模、数据隔离、事件范围、边界事件

(1)流程定义文件

主要是需要一个

<subProcess>

 <...><!--其中也需要有开始和结束节点-->

重要的代码:

<serviceTask id="pay" name="确认支付" activiti:class="com.syc.activiti.example.MyPayJavaDelegate"/>

<serviceTask id="take" name="确认收货" activiti:class="com.syc.activiti.example.MyTakeJavaDelegate"/>

 </subProcess>

还需要一个边界事件:

<boundaryEvent id="boundary" attachedToRef="subProcess">

    <errorEventDefinition errorRef="bpmnError"></errorEventDefinition>

</boundaryEvent>

(2)编写两个Delegate

一个是MyPayJavaDelegate,一个是MyTakeJavaDelegate,两个类代码类似。

public class MyPayJavaDelegate implements JavaDelegate, Serializable {private static final Logger LOGGER = LoggerFactory.getLogger(MyPayJavaDelegate.class);@Overridepublic void execute(DelegateExecution execution) {LOGGER.info("run my pay java delegate {}", this);}
}

 (3)编写测试类SubProcessTest

@Test
@Deployment(resources = "my-process-subprocess1.bpmn20.xml")
public void testSubProcess(){ProcessInstance processInstance = activitiRule.getRuntimeService().startProcessInstanceByKey("my-process");Task task = activitiRule.getTaskService().createTaskQuery().singleResult();LOGGER.info("task.name = {}",task.getName());
}

 (4)测试效果

最终指向的是订单完成节点。

(5)测试异常情况

在MyPayJavaDelegate类中抛出异常

public class MyPayJavaDelegate implements JavaDelegate, Serializable {private static final Logger LOGGER = LoggerFactory.getLogger(MyPayJavaDelegate.class);@Overridepublic void execute(DelegateExecution execution) {LOGGER.info("run my pay java delegate {}", this);Object errorflag = execution.getVariable("errorflag");if(Objects.equals(errorflag, true)){throw new BpmnError("bpmnError");}LOGGER.info("pay error");}
}

 测试效果

2. 事件子流程

   说明:事件子流程可以捕获任意节点抛出的错误事件

   流程定义文件子流程代码:

<subProcess id="subProcess" triggeredByEvent="true"><startEvent id="startSub"><errorEventDefinition errorRef="bpmnError"></errorEventDefinition></startEvent><endEvent id="endSub"/><userTask id="orderError" name="异常处理"/><sequenceFlow sourceRef="startSub" targetRef="orderError"/><sequenceFlow sourceRef="orderError" targetRef="endSub"/>
</subProcess>

测试代码无需修改,测试效果如上,能够打印出  task.nam = "异常处理"

事件子流程可以获取到局部变量的信息:

例如在MyPayJavaDelegate中添加局部变量key2的值为value2:

execution.getParent().setVariableLocal("key2", "value2");

 

这篇关于BPMN2.0中的顺序流、网关和子流程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/414274

相关文章

Spring Security中用户名和密码的验证完整流程

《SpringSecurity中用户名和密码的验证完整流程》本文给大家介绍SpringSecurity中用户名和密码的验证完整流程,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定... 首先创建了一个UsernamePasswordAuthenticationTChina编程oken对象,这是S

Spring如何使用注解@DependsOn控制Bean加载顺序

《Spring如何使用注解@DependsOn控制Bean加载顺序》:本文主要介绍Spring如何使用注解@DependsOn控制Bean加载顺序,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录1.javascript 前言2. 代码实现总结1. 前言默认情况下,Spring加载Bean的顺

Android ViewBinding使用流程

《AndroidViewBinding使用流程》AndroidViewBinding是Jetpack组件,替代findViewById,提供类型安全、空安全和编译时检查,代码简洁且性能优化,相比Da... 目录一、核心概念二、ViewBinding优点三、使用流程1. 启用 ViewBinding (模块级

SpringBoot整合Flowable实现工作流的详细流程

《SpringBoot整合Flowable实现工作流的详细流程》Flowable是一个使用Java编写的轻量级业务流程引擎,Flowable流程引擎可用于部署BPMN2.0流程定义,创建这些流程定义的... 目录1、流程引擎介绍2、创建项目3、画流程图4、开发接口4.1 Java 类梳理4.2 查看流程图4

java Long 与long之间的转换流程

《javaLong与long之间的转换流程》Long类提供了一些方法,用于在long和其他数据类型(如String)之间进行转换,本文将详细介绍如何在Java中实现Long和long之间的转换,感... 目录概述流程步骤1:将long转换为Long对象步骤2:将Longhttp://www.cppcns.c

Java中JSON格式反序列化为Map且保证存取顺序一致的问题

《Java中JSON格式反序列化为Map且保证存取顺序一致的问题》:本文主要介绍Java中JSON格式反序列化为Map且保证存取顺序一致的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录背景问题解决方法总结背景做项目涉及两个微服务之间传数据时,需要提供方将Map类型的数据序列化为co

spring-gateway filters添加自定义过滤器实现流程分析(可插拔)

《spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔)》:本文主要介绍spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔),本文通过实例图... 目录需求背景需求拆解设计流程及作用域逻辑处理代码逻辑需求背景公司要求,通过公司网络代理访问的请求需要做请

使用JavaConfig配置Spring的流程步骤

《使用JavaConfig配置Spring的流程步骤》JavaConfig是Spring框架提供的一种基于Java的配置方式,它通过使用@Configuration注解标记的类来替代传统的XML配置文... 目录一、什么是 JavaConfig?1. 核心注解2. 与 XML 配置的对比二、JavaConf

MySQL中SQL的执行顺序详解

《MySQL中SQL的执行顺序详解》:本文主要介绍MySQL中SQL的执行顺序,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql中SQL的执行顺序SQL执行顺序MySQL的执行顺序SELECT语句定义SELECT语句执行顺序总结MySQL中SQL的执行顺序

Java对接Dify API接口的完整流程

《Java对接DifyAPI接口的完整流程》Dify是一款AI应用开发平台,提供多种自然语言处理能力,通过调用Dify开放API,开发者可以快速集成智能对话、文本生成等功能到自己的Java应用中,本... 目录Java对接Dify API接口完整指南一、Dify API简介二、准备工作三、基础对接实现1.