当前位置: 首页 > article >正文

用Activiti/Flowable跑一遍就懂了:BPMN2.0四种网关的Java代码与执行日志全解析

深入解析BPMN2.0四大网关Activiti/Flowable实战与日志分析在业务流程管理领域BPMN2.0标准中的网关(Gateways)是控制流程走向的核心元素。本文将基于Spring Boot环境通过Activiti/Flowable引擎的实际代码演示结合执行日志和数据库表变化深度剖析排他网关、并行网关、包容网关和基于事件网关的工作原理。不同于单纯的概念讲解我们将从工程实践角度用可复现的测试案例展示每种网关的分支合并行为。1. 环境准备与基础配置在开始网关实验前我们需要准备一个标准的Spring Boot项目集成Activiti/Flowable。以下是Maven依赖配置示例dependencies dependency groupIdorg.activiti/groupId artifactIdactiviti-spring-boot-starter/artifactId version7.1.0.M6/version /dependency dependency groupIdcom.h2database/groupId artifactIdh2/artifactId scoperuntime/scope /dependency /dependencies为方便观察网关行为建议在application.properties中开启调试日志logging.level.org.activitiDEBUG创建基础测试类模板后续所有网关测试都将继承此类SpringBootTest public abstract class GatewayTestBase { Autowired private RuntimeService runtimeService; Autowired private TaskService taskService; Autowired private RepositoryService repositoryService; protected ProcessInstance startProcess(String processDefinitionKey, MapString, Object variables) { return runtimeService.startProcessInstanceByKey(processDefinitionKey, variables); } protected void deployProcess(String bpmnFile) { repositoryService.createDeployment() .addClasspathResource(bpmnFile) .deploy(); } }2. 排他网关(Exclusive Gateway)实战解析排他网关是最常用的决策节点其特点是仅选择一条符合条件的路径。我们构建一个订单审核流程来演示其特性process idexclusiveGatewayDemo startEvent idstart/ sequenceFlow idflow1 sourceRefstart targetRefexclusiveGw/ exclusiveGateway idexclusiveGw nameApproval Gateway/ sequenceFlow idflow2 sourceRefexclusiveGw targetRefapproveTask conditionExpression xsi:typetFormalExpression ${order.amount 1000} /conditionExpression /sequenceFlow sequenceFlow idflow3 sourceRefexclusiveGw targetRefmanagerApproveTask conditionExpression xsi:typetFormalExpression ${order.amount 1000 order.amount 5000} /conditionExpression /sequenceFlow sequenceFlow idflow4 sourceRefexclusiveGw targetRefdirectorApproveTask conditionExpression xsi:typetFormalExpression ${order.amount 5000} /conditionExpression /sequenceFlow !-- 各审批任务定义省略 -- /process关键测试案例展示不同金额订单的路由逻辑public class ExclusiveGatewayTest extends GatewayTestBase { Test public void testLowAmountApproval() { MapString, Object vars new HashMap(); vars.put(order, new Order(800)); // 测试金额800元 ProcessInstance pi startProcess(exclusiveGatewayDemo, vars); Task task taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult(); assertEquals(Approve Task, task.getName()); // 验证进入普通审批 } Test public void testHighAmountApproval() { MapString, Object vars new HashMap(); vars.put(order, new Order(6000)); // 测试金额6000元 ProcessInstance pi startProcess(exclusiveGatewayDemo, vars); Task task taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult(); assertEquals(Director Approve Task, task.getName()); // 验证进入总监审批 } }观察引擎日志可以发现关键行为DEBUG o.a.e.i.bpmn.behavior.ExclusiveGatewayActivityBehavior - Leaving exclusive gateway exclusiveGw with sequence flow flow4数据库表ACT_RU_EXECUTION的变化显示无论选择哪条路径都只会有一条执行记录继续流动。提示排他网关的条件表达式应互斥否则引擎会选择XML中第一个符合条件的路径3. 并行网关(Parallel Gateway)并发机制揭秘并行网关用于创建同步的并发路径典型应用场景如订单处理中的支付与发货并行process idparallelGatewayDemo startEvent idstart/ sequenceFlow idflow1 sourceRefstart targetReffork/ parallelGateway idfork/ sequenceFlow idflow2 sourceReffork targetRefpaymentTask/ sequenceFlow idflow3 sourceReffork targetRefshippingTask/ userTask idpaymentTask nameReceive Payment/ userTask idshippingTask nameShip Order/ sequenceFlow idflow4 sourceRefpaymentTask targetRefjoin/ sequenceFlow idflow5 sourceRefshippingTask targetRefjoin/ parallelGateway idjoin/ sequenceFlow idflow6 sourceRefjoin targetRefarchiveTask/ userTask idarchiveTask nameArchive Order/ /process测试代码验证并行执行特性public class ParallelGatewayTest extends GatewayTestBase { Test public void testForkJoinBehavior() { ProcessInstance pi startProcess(parallelGatewayDemo, new HashMap()); // 验证同时创建两个任务 ListTask tasks taskService.createTaskQuery() .processInstanceId(pi.getId()) .orderByTaskName() .asc() .list(); assertEquals(2, tasks.size()); assertEquals(Receive Payment, tasks.get(0).getName()); assertEquals(Ship Order, tasks.get(1).getName()); // 模拟完成支付任务 taskService.complete(tasks.get(0).getId()); // 此时归档任务仍未创建 assertNull(taskService.createTaskQuery() .processInstanceId(pi.getId()) .taskName(Archive Order) .singleResult()); // 完成发货任务后归档任务出现 taskService.complete(tasks.get(1).getId()); assertNotNull(taskService.createTaskQuery() .processInstanceId(pi.getId()) .taskName(Archive Order) .singleResult()); } }数据库观察发现当流程到达fork网关时ACT_RU_EXECUTION表会新增两条记录IDPROC_INST_ID_ACT_ID_IS_ACTIVE_11001fork021001paymentTask131001shippingTask1日志中的关键条目DEBUG o.a.e.i.bpmn.behavior.ParallelGatewayActivityBehavior - Forking execution for parallel gateway fork into 2 branches4. 包容网关(Inclusive Gateway)动态路由剖析包容网关结合了排他与并行网关的特性允许动态决定并行路径数量。典型应用如多条件审批流程process idinclusiveGatewayDemo startEvent idstart/ sequenceFlow idflow1 sourceRefstart targetRefinclusiveGw/ inclusiveGateway idinclusiveGw nameCheck Requirements/ sequenceFlow idflow2 sourceRefinclusiveGw targetReflegalReview conditionExpression xsi:typetFormalExpression ${contract.needLegalReview} /conditionExpression /sequenceFlow sequenceFlow idflow3 sourceRefinclusiveGw targetReffinanceReview conditionExpression xsi:typetFormalExpression ${contract.value 10000} /conditionExpression /sequenceFlow sequenceFlow idflow4 sourceRefinclusiveGw targetReftechReview conditionExpression xsi:typetFormalExpression ${contract.hasTechnicalClause} /conditionExpression /sequenceFlow !-- 各审核任务定义省略 -- inclusiveGateway idjoinGw/ sequenceFlow idflow5 sourceReflegalReview targetRefjoinGw/ sequenceFlow idflow6 sourceReffinanceReview targetRefjoinGw/ sequenceFlow idflow7 sourceReftechReview targetRefjoinGw/ sequenceFlow idflow8 sourceRefjoinGw targetReffinalizeTask/ /process测试案例展示不同场景下的路由组合public class InclusiveGatewayTest extends GatewayTestBase { Test public void testSinglePath() { Contract contract new Contract(); contract.setNeedLegalReview(true); MapString, Object vars new HashMap(); vars.put(contract, contract); ProcessInstance pi startProcess(inclusiveGatewayDemo, vars); ListTask tasks taskService.createTaskQuery() .processInstanceId(pi.getId()) .list(); assertEquals(1, tasks.size()); assertEquals(Legal Review, tasks.get(0).getName()); } Test public void testMultiplePaths() { Contract contract new Contract(); contract.setValue(15000); contract.setHasTechnicalClause(true); MapString, Object vars new HashMap(); vars.put(contract, contract); ProcessInstance pi startProcess(inclusiveGatewayDemo, vars); ListTask tasks taskService.createTaskQuery() .processInstanceId(pi.getId()) .orderByTaskName() .asc() .list(); assertEquals(2, tasks.size()); assertEquals(Finance Review, tasks.get(0).getName()); assertEquals(Technical Review, tasks.get(1).getName()); } }日志中可以看到条件计算过程DEBUG o.a.e.i.bpmn.behavior.InclusiveGatewayActivityBehavior - Evaluating condition on sequence flow flow3: ${contract.value 10000} - true5. 基于事件的网关(Event-based Gateway)异步处理机制基于事件的网关适用于需要等待外部事件触发的场景如订单取消或超时处理process ideventGatewayDemo startEvent idstart/ sequenceFlow idflow1 sourceRefstart targetRefeventGw/ eventBasedGateway ideventGw/ sequenceFlow idflow2 sourceRefeventGw targetRefcancelEvent/ sequenceFlow idflow3 sourceRefeventGw targetReftimeoutEvent/ intermediateCatchEvent idcancelEvent messageEventDefinition messageReforderCancelMsg/ /intermediateCatchEvent intermediateCatchEvent idtimeoutEvent timerEventDefinition timeDurationPT2H/timeDuration /timerEventDefinition /intermediateCatchEvent sequenceFlow idflow4 sourceRefcancelEvent targetRefhandleCancel/ sequenceFlow idflow5 sourceReftimeoutEvent targetRefhandleTimeout/ !-- 各处理任务定义省略 -- /process测试案例展示事件触发机制public class EventGatewayTest extends GatewayTestBase { Test public void testMessageEventTrigger() throws InterruptedException { ProcessInstance pi startProcess(eventGatewayDemo, new HashMap()); // 初始状态无任务 assertNull(taskService.createTaskQuery() .processInstanceId(pi.getId()) .singleResult()); // 模拟发送取消消息 runtimeService.messageEventReceived(orderCancelMsg, pi.getId()); // 验证处理取消的任务被创建 Task task taskService.createTaskQuery() .processInstanceId(pi.getId()) .singleResult(); assertEquals(Handle Cancellation, task.getName()); } Test public void testTimerEventTrigger() { // 需要配置时间偏移测试 } }引擎日志显示事件订阅创建DEBUG o.a.e.i.bpmn.behavior.EventBasedGatewayActivityBehavior - Created event subscription for MessageEventDefinition with message orderCancelMsg数据库表ACT_RU_EVENT_SUBSCR会记录当前等待的事件订阅。

相关文章:

用Activiti/Flowable跑一遍就懂了:BPMN2.0四种网关的Java代码与执行日志全解析

深入解析BPMN2.0四大网关:Activiti/Flowable实战与日志分析 在业务流程管理领域,BPMN2.0标准中的网关(Gateways)是控制流程走向的核心元素。本文将基于Spring Boot环境,通过Activiti/Flowable引擎的实际代码演示,结合执行日志和数…...

MT3201 普通 300/900ns 单线归零码三通道 LED 恒流驱动控制芯片

概述 MT3201 是单线归零码三通道 LED(发光二极管显示器)恒流驱动控制芯片,采用 300/900ns 单线归零码通讯协议。 MT3201 芯片内部集成有单线归零码数字接口、数据锁存器、LED 输出恒流驱动、内置 RC 振荡器、输出数据自动整形转发等电路。 MT…...

基于SpringBoot+Vue图书馆座位预约系统设计与实现+毕业论文+答辩PPT+指导搭建视频

开发工具: Idea或Eclipse数据库: MySQLJar包仓库: Maven前端框架: Vue2后端框架: Springboot具体请看视频演示源码已经过本人亲自测试,可完美运行...

高斯分布与拉普拉斯分布:从数学原理到Python实战

1. 高斯分布与拉普拉斯分布的核心数学原理 我第一次接触高斯分布是在大学物理实验课上,教授用它来描述测量误差。当时觉得这个"钟形曲线"特别神奇,后来才发现它无处不在——从考试成绩分布到股票价格波动。而拉普拉斯分布则是在研究金融数据时…...

终极指南:如何用ChemCrow AI助手在5分钟内完成复杂化学分析

终极指南:如何用ChemCrow AI助手在5分钟内完成复杂化学分析 【免费下载链接】chemcrow-public Chemcrow 项目地址: https://gitcode.com/gh_mirrors/ch/chemcrow-public ChemCrow是一个基于大语言模型的化学智能助手,通过整合12种专业化学工具&am…...

KCN-GenshinServer:5步快速搭建原神私服的终极GUI解决方案

KCN-GenshinServer:5步快速搭建原神私服的终极GUI解决方案 【免费下载链接】KCN-GenshinServer 基于GC制作的原神一键GUI多功能服务端。 项目地址: https://gitcode.com/gh_mirrors/kc/KCN-GenshinServer 你是否曾想过在自己的电脑上搭建一个原神私服&#x…...

AdaIN在StyleGAN中的应用:从风格迁移到图像生成的进阶之路

AdaIN在StyleGAN中的应用:从风格迁移到图像生成的进阶之路 当你在深夜刷到一张梵高风格的宠物照片时,可能不会想到这背后藏着怎样的技术魔法。这种将艺术风格瞬间迁移到任意内容图像的能力,正是自适应实例归一化(AdaIN&#xff09…...

ComfyUI IPAdapter Plus完整指南:10分钟掌握AI图像风格转换与多模态生成

ComfyUI IPAdapter Plus完整指南:10分钟掌握AI图像风格转换与多模态生成 【免费下载链接】ComfyUI_IPAdapter_plus 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI_IPAdapter_plus ComfyUI IPAdapter Plus是一个功能强大的开源插件,专为C…...

极域电子教室终极破解指南:如何用JiYuTrainer实现自主学习与教学平衡

极域电子教室终极破解指南:如何用JiYuTrainer实现自主学习与教学平衡 【免费下载链接】JiYuTrainer 极域电子教室防控制软件, StudenMain.exe 破解 项目地址: https://gitcode.com/gh_mirrors/ji/JiYuTrainer JiYuTrainer是一款专为破解极域电子教室系统限制…...

Blender化学品插件终极指南:快速创建专业3D分子模型

Blender化学品插件终极指南:快速创建专业3D分子模型 【免费下载链接】blender-chemicals Draws chemicals in Blender using common input formats (smiles, molfiles, cif files, etc.) 项目地址: https://gitcode.com/gh_mirrors/bl/blender-chemicals 还在…...

Cursor Pro免费激活实用指南:一键解锁AI编程助手完整功能

Cursor Pro免费激活实用指南:一键解锁AI编程助手完整功能 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your …...

如何用AntiDupl.NET快速清理电脑中的重复图片:终极免费解决方案

如何用AntiDupl.NET快速清理电脑中的重复图片:终极免费解决方案 【免费下载链接】AntiDupl A program to search similar and defect pictures on the disk 项目地址: https://gitcode.com/gh_mirrors/an/AntiDupl 你是否曾为电脑里堆积如山的重复图片而烦恼…...

免费获取百度文库文档的简单高效方案

免费获取百度文库文档的简单高效方案 【免费下载链接】baidu-wenku fetch the document for free 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wenku 百度文库助手是一个专门为百度文库用户设计的实用工具,能够帮助你免费获取文库文档内容&#xff0…...

Windows网络排错神器:用PowerShell的Find-NetRoute命令3步定位连接问题

Windows网络排错实战:用PowerShell三步精准定位连接故障 办公室里突然上不了网?作为Helpdesk工程师,你可能会遇到这样的场景:用户焦急地报告"网络断了",而你需要快速定位问题根源。传统方法可能需要反复切换…...

告别龟速!在Windows上用Bun加速你的Vue/React项目(附PowerShell报错解决)

告别龟速!在Windows上用Bun加速你的Vue/React项目(附PowerShell报错解决) 如果你是一名Windows平台的前端开发者,是否经常被npm install的漫长等待折磨得失去耐心?或是看着yarn在安装依赖时缓慢爬行的进度条感到绝望&a…...

李慕婉-仙逆-造相Z-Turbo 从提示词到精美图片:深度解析提示词工程核心技巧

李慕婉-仙逆-造相Z-Turbo 从提示词到精美图片:深度解析提示词工程核心技巧 你是不是也遇到过这样的情况:看到别人用AI模型生成的图片,细节丰富、光影绝美、氛围感十足,而自己用同样的模型,输入描述后得到的图片却总是…...

Qwen2.5-72B-GPTQ-Int4快速上手:3步完成镜像免配置与Web前端调用

Qwen2.5-72B-GPTQ-Int4快速上手:3步完成镜像免配置与Web前端调用 1. 模型简介 Qwen2.5-72B-Instruct-GPTQ-Int4是通义千问大模型系列的最新版本,作为一款72.7亿参数的大型语言模型,它在多个方面实现了显著提升: 知识量与能力增…...

别再死记硬背Gamma、HLG、PQ公式了!用Python手动画出三条曲线,彻底搞懂它们的区别

用Python可视化Gamma、HLG、PQ曲线:从代码实践理解HDR核心算法 在数字影像处理领域,Gamma校正、HLG(Hybrid Log-Gamma)和PQ(Perceptual Quantizer)是三种关键的传递函数(Transfer Function&…...

解锁WeMod完整功能:Wand-Enhancer开源增强工具完全指南

解锁WeMod完整功能:Wand-Enhancer开源增强工具完全指南 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/gh_mirrors/we/Wand-Enhancer 想要免费解锁WeMod游戏助手的专业版功…...

基于物联网技术的智慧餐厅管理系统设计与实现(有完整资料)

资料查找方式:特纳斯电子(电子校园网):搜索下面编号即可编号:T1032309M设计简介:本设计是基于物联网技术的智慧餐厅系统设计,主要实现以下功能:通过RFID感应模块通过对RFID卡进行监测…...

QMIX算法解析:多智能体强化学习中的值函数分解与单调性约束

1. QMIX算法概述 多智能体强化学习(MARL)是近年来人工智能领域的热门研究方向之一。想象一下星际争霸中的战斗场景:一队机枪兵需要协作击败敌人,每个单位都需要根据局部观察做出决策,同时保持整体战术配合。这正是QMIX…...

栋察宇宙(五十):C语言数据类型

分享兴趣,传播快乐,增长见闻,留下美好!亲爱的您,这里是LearningYard新学苑。今天小编为大家带来“C语言数据类型”。欢迎您的访问!Share interest, spread happiness, increase knowledge, and leave beaut…...

从无人机到平衡车:拆解基于四元数EKF的MPU9250数据融合,搞定你的第一个姿态感知项目

从无人机到平衡车:拆解基于四元数EKF的MPU9250数据融合,搞定你的第一个姿态感知项目 想象一下,当你第一次尝试让两轮小车自主保持平衡时,那种既兴奋又忐忑的心情。传感器数据在屏幕上跳动,但小车却像喝醉了一样左右摇…...

怀旧灵武兽魂天龙八部单机版+虚拟机一键端+GM后台:从零搭建到畅玩的完整指南

1. 准备工作:虚拟机与资源下载 想要体验怀旧灵武兽魂版天龙八部单机游戏,首先需要准备好虚拟机环境和游戏资源包。这里我推荐使用VMware Workstation 12,这个版本对老游戏兼容性最好。安装过程很简单,双击安装包一路下一步就行&am…...

宇宙有多大?

人类曾认为,夜空是太阳休息时包裹着地球的未被照亮的球体(他们认为太阳就在这个球体内运行)。 随着人们出于宗教原因研究天空、试图理解其存在的意义,或者更具逻辑性地,为了预测 “生长季节” 与 “时间” 以便规划文明…...

GPS数据处理必备:手把手教你用Python自动下载IGS精密星历(含SP3文件解析)

GPS数据处理实战:Python自动化下载与解析IGS精密星历全指南 在卫星导航定位领域,精密星历数据如同精准的"太空路标",为各类高精度应用提供厘米级的位置基准。不同于广播星历的实时性,IGS(国际GNSS服务)提供的SP3格式精密…...

MoeKoe Music:重新定义二次元音乐体验的完整实践手册

MoeKoe Music:重新定义二次元音乐体验的完整实践手册 【免费下载链接】MoeKoeMusic 一款开源简洁高颜值的酷狗第三方客户端 An open-source, concise, and aesthetically pleasing third-party client for KuGou that supports Windows / macOS / Linux / Web :elec…...

Cadence 17.4 原理图绘制避坑指南:从Capture快捷键到DRC检查的完整流程

Cadence 17.4 原理图绘制避坑指南:从Capture快捷键到DRC检查的完整流程 刚接触Cadence 17.4的工程师常会遇到这样的困境:明明在其他EDA工具上能快速完成的操作,在这里却要反复摸索。本文将带你避开那些官方文档未提及的"暗坑"&…...

仅限头部AI实验室使用的多模态推理成本诊断框架(MoE-Visual Profiler v2.1内测版核心逻辑公开)

第一章:多模态大模型推理成本优化 2026奇点智能技术大会(https://ml-summit.org) 多模态大模型(如LLaVA、Qwen-VL、Fuyu-8B)在图像理解、跨模态检索与视觉问答等任务中展现出强大能力,但其推理阶段的显存占用、延迟与能耗显著高于…...

别再到处找教程了!手把手教你用CCProxy搭建个人SOCKS5代理服务器(附防火墙和杀软设置避坑)

零基础构建安全SOCKS5代理:CCProxy实战指南与深度避坑手册 在数字化办公与远程协作成为常态的今天,高效安全的网络访问能力已成为现代人的刚需。想象这样一个场景:你正在咖啡馆赶制一份急需提交的方案,却发现公司内网资源无法访问…...