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

BPM引擎系列(三) Flowable实战-Activiti分家后的升级版

Flowable实战——Activiti分家后的升级版系列第三篇Flowable 6.x Spring Boot 集成看看原班人马搞出来的升级版到底强在哪。一、Activiti 团队为啥分家了上篇咱们把Activiti跑起来了但评论区肯定有人要问了“Activiti 7 都不怎么维护了为啥不直接用 Flowable”这个问题得从历史说起。2010年Tom Baeyens 创建了 Activiti后来去了 Alfresco。2016年左右Activiti 核心开发团队里的一部分人包括 Tijs Rademakers觉得 Activiti 6 的发展方向不太对于是**分家出来创建了 Flowable**。Activiti 5/6 核心团队 │ ├──→ 留在 Alfresco → Activiti 7 (TOMATO) │ └──→ 出来单干 → Flowable 6/7分家的核心原因Activiti 7 开始往云原生、微服务方向转TOMATO项目和原来的轻量级引擎定位不同Flowable 团队想继续把 BPM 引擎本身做好保持轻量、灵活所以 Flowable 可以理解为“Activiti 的精神续作”——API兼容但功能更强、Bug修得更快。二、Flowable vs Activiti代码层面差多少先说结论如果你会 Activiti学 Flowable 几乎零成本。2.1 依赖对比ActivitidependencygroupIdorg.activiti/groupIdartifactIdactiviti-spring-boot-starter/artifactIdversion7.1.0.M6/version/dependencyFlowabledependencygroupIdorg.flowable/groupIdartifactIdflowable-spring-boot-starter/artifactIdversion6.8.0/version/dependency就改个 groupId 和 artifactId版本号不同其他套路一模一样。2.2 配置对比Activiti 的 application.ymlactiviti:database-schema-update:truecheck-process-definitions:trueprocess-definition-location-prefix:classpath:/processes/history-level:fullFlowable 的 application.ymlflowable:database-schema-update:truecheck-process-definitions:trueprocess-definition-location-prefix:classpath:/processes/history-level:full区别前缀从activiti:变成了flowable:其他完全一样。2.3 BPMN 文件对比Activitidefinitionsxmlns:activitihttp://activiti.org/bpmnuserTaskactiviti:assignee${managerId}/serviceTaskactiviti:expression${hrService.record(execution)}//definitionsFlowabledefinitionsxmlns:flowablehttp://flowable.org/bpmnuserTaskflowable:assignee${managerId}/serviceTaskflowable:expression${hrService.record(execution)}//definitions区别命名空间从activiti:变成了flowable:其他完全一样。2.4 Java API 对比Activitiimportorg.activiti.engine.RuntimeService;importorg.activiti.engine.TaskService;importorg.activiti.engine.runtime.ProcessInstance;importorg.activiti.engine.task.Task;Flowableimportorg.flowable.engine.RuntimeService;importorg.flowable.engine.TaskService;importorg.flowable.engine.runtime.ProcessInstance;importorg.flowable.task.api.Task;区别包名从org.activiti变成了org.flowable类名和方法名完全一样。说白了把代码里的activiti全局替换成flowable项目就能跑起来。三、Flowable 的增强特性如果只是改个名字那Flowable也没啥好说的。关键是Flowable在Activiti的基础上加了不少实用功能。3.1 更完善的 REST APIFlowable 内置了 REST API虽然咱们这篇主要讲Spring Boot集成但这个值得一提# Flowable 自带 REST APIGET /flowable-rest/service/runtime/process-instances GET /flowable-rest/service/runtime/tasks POST /flowable-rest/service/runtime/tasks/{taskId}Activiti 7 也有 REST API但 Flowable 的文档更全、接口更稳定。3.2 动态表单支持Flowable 支持在流程定义里直接配置表单userTaskidmanager-approvalname经理审批flowable:assignee${managerId}extensionElementsflowable:formPropertyidapprovedname审批结果typebooleanrequiredtrue/flowable:formPropertyidcommentname审批意见typestring//extensionElements/userTask这样前端就可以根据流程定义动态渲染表单不用硬编码。3.3 事件监听器Flowable 支持更灵活的事件监听ComponentpublicclassMyEventListenerimplementsFlowableEventListener{OverridepublicvoidonEvent(FlowableEventevent){if(event.getType()FlowableEngineEventType.TASK_CREATED){// 任务创建时发送通知TaskEntitytask(TaskEntity)((FlowableEntityEvent)event).getEntity();log.info(新任务创建: {}, 处理人: {},task.getName(),task.getAssignee());}}OverridepublicbooleanisFailOnException(){returnfalse;}OverridepublicbooleanisFireOnTransactionLifecycleEvent(){returnfalse;}OverridepublicStringgetOnTransaction(){returnnull;}}3.4 异步历史数据Flowable 支持异步处理历史数据提升运行时性能flowable:async-history-enabled:trueasync-history-executor-activate:true这样流程执行时不用等历史数据写入响应更快。四、Spring Boot 集成 Flowable好了理论说完咱们上代码。因为API和Activiti几乎一样我重点讲差异和增强点。4.1 项目结构flowable-demo/ ├── pom.xml ├── src/main/resources/ │ ├── application.yml │ └── processes/leave-process.bpmn20.xml └── src/main/java/com/example/flowable/ ├── FlowableDemoApplication.java ├── controller/LeaveController.java └── service/ ├── HrService.java └── EmailService.java发现和 Activiti 的项目结构几乎一样没错就是复制粘贴改个包名的事。4.2 核心代码启动流程RestControllerRequestMapping(/api/leave)publicclassLeaveController{AutowiredprivateRuntimeServiceruntimeService;// 包名是 org.flowable.engineAutowiredprivateTaskServicetaskService;PostMapping(/start)publicMapString,ObjectstartProcess(RequestParamStringapplicant,RequestParamStringmanagerId,RequestParamStringdirectorId,RequestParamIntegerdays){MapString,ObjectvariablesnewHashMap();variables.put(applicant,applicant);variables.put(managerId,managerId);variables.put(directorId,directorId);variables.put(days,days);// 和 Activiti 一模一样的 APIProcessInstanceinstanceruntimeService.startProcessInstanceByKey(leave-process,variables);returnMap.of(processInstanceId,instance.getId(),message,请假流程已启动);}}查询待办、完成任务代码和 Activiti 完全一样就不重复贴了。完整版见配套源码。4.3 服务任务实现Service(hrService)publicclassHrService{publicvoidrecord(DelegateExecutionexecution){// 注意这里的 DelegateExecution 是 org.flowable.engine.delegate.DelegateExecutionStringapplicant(String)execution.getVariable(applicant);Integerdays(Integer)execution.getVariable(days);log.info(【HR备案】员工 {} 请假 {} 天已记录,applicant,days);}}唯一的区别DelegateExecution的包名从org.activiti变成了org.flowable。五、从 Activiti 迁移到 Flowable如果你已经在用 Activiti想迁移到 Flowable步骤如下Step 1替换依赖!-- 删除 --dependencygroupIdorg.activiti/groupIdartifactIdactiviti-spring-boot-starter/artifactId/dependency!-- 替换为 --dependencygroupIdorg.flowable/groupIdartifactIdflowable-spring-boot-starter/artifactIdversion6.8.0/version/dependencyStep 2修改配置文件把application.yml里的activiti:改成flowable:。Step 3修改 BPMN 命名空间把 BPMN 文件里的xmlns:activiti改成xmlns:flowable所有activiti:前缀改成flowable:。可以用 IDE 的全局替换一键搞定。Step 4修改 Java 包名把代码里的org.activiti替换成org.flowable。Step 5数据库迁移Flowable 的表结构和 Activiti 基本一致毕竟同源但有一些差异Flowable 6.x 的表名也是ACT_*前缀启动时设置flowable.database-schema-update: trueFlowable 会自动处理表结构差异建议先在测试环境跑一遍确认数据没问题再上生产迁移成本评估纯 API 使用很低改包名就行有自定义SQL查Activiti表中等需要核对表字段差异用了Activiti的高级特性如IdentityService大量操作较高需要测试验证六、跑起来测试6.1 启动应用cdflowable-demo mvn spring-boot:run端口是 8082和 Activiti 的 8081 区分开。6.2 API 测试和 Activiti 的测试流程完全一样# 启动流程curl-XPOSThttp://localhost:8082/api/leave/start\-dapplicant小红\-dmanagerIdmanager-zhang\-ddirectorIddirector-li\-ddays5# 查经理待办curlhttp://localhost:8082/api/leave/tasks?assigneemanager-zhang# 经理通过curl-XPOSThttp://localhost:8082/api/leave/complete\-dtaskIdxxx\-dapprovedtrue6.3 单元测试mvntest三个测试场景和 Activiti 完全一致短假2天经理通过 → 流程结束长假5天经理通过 → 总监通过 → 流程结束经理驳回 → 流程结束七、Flowable 的优缺点优点✅ API 和 Activiti 高度兼容迁移成本低✅ 社区更活跃Bug修复更快✅ 功能更丰富动态表单、事件监听、异步历史等✅ 文档质量高✅ 同时支持BPMN、CMMN案例管理、DMN决策表缺点❌ 相比 Activiti名气稍小但正在追赶❌ 没有 Camunda 那样强大的 Web 管理界面❌ 企业版Flowable Work功能更全但社区版有些功能受限八、小结这篇咱们聊了Flowable 的身世——Activiti 原班人马分家后的作品和 Activiti 的代码对比——改个包名就能跑几乎零成本Flowable 的增强特性——动态表单、事件监听、异步历史迁移指南——5步从 Activiti 迁到 Flowable跑通测试——同样的请假流程同样的API下一篇预告企业级 BPM 的专业选手——Camunda。它不仅有引擎还有强大的 Web 监控界面 Cockpit咱们来看看怎么玩。配套源码本文完整源码位于03-flowable-demo/包含完整的pom.xml和application.yml请假流程 BPMN 定义Flowable 命名空间REST API Controller服务任务实现单元测试3个场景全覆盖你从 Activiti 迁移到 Flowable 过吗遇到过什么坑欢迎交流

相关文章:

BPM引擎系列(三) Flowable实战-Activiti分家后的升级版

Flowable实战——Activiti"分家"后的升级版 系列第三篇:Flowable 6.x Spring Boot 集成,看看原班人马搞出来的升级版到底强在哪。 一、Activiti 团队为啥"分家"了? 上篇咱们把Activiti跑起来了,但评论区肯定…...

BPM引擎系列(二) Activiti入门-老牌引擎还能打吗

Activiti入门——老牌引擎还能打吗?系列第二篇:Activiti 7 Spring Boot 集成实战,从配置到跑通一个请假流程。一、Activiti?Flowable?Camunda?我懵了 上篇咱们学完了BPMN,信心满满地准备上手干…...

AI Agent Harness Engineering 如何应用于电商并提升 GMV 与转化率

AI Agent Harness Engineering 在电商领域的应用:从原理到实践,全面提升 GMV 与转化率 1. 标题 (Title) AI Agent Harness Engineering 实战指南:构建智能电商系统,全面提升 GMV 与转化率 从理论到实践:AI 代理管线工程如何重塑电商体验,驱动业务增长 智能电商时代:利用…...

微信聊天记录永久保存终极指南:WeChatMsg让数据真正属于你

微信聊天记录永久保存终极指南:WeChatMsg让数据真正属于你 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/W…...

灵魂商数(SQ) · 全域数学统一定义【乖乖数学】

灵魂商数(SQ) 全域数学统一定义【乖乖数学】 作者:乖乖数学 时间:20260422一、核心信息 • 英文全称:Spiritual Intelligence Quotient(SQ) • 中文译名:灵魂商数 / 灵商 / 魂商 …...

3个核心技巧:让DownKyi成为你的B站视频收藏专家

3个核心技巧:让DownKyi成为你的B站视频收藏专家 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水印等)…...

全域数学:核素对称能与物质稳定性定量定理(投稿精简版)【乖乖数学】

全域数学:核素对称能与物质稳定性定量定理(投稿精简版)【乖乖数学】 作者:乖乖数学 时间:20260422...

VxWorks核心内核模块:任务管理模块完整解读实践篇(1)

第一部分:任务管理概述与基本概念第一章:实时操作系统中的任务管理哲学在深入探讨VxWorks任务管理模块的技术细节之前,我们首先需要理解实时操作系统中任务管理的核心哲学。实时系统与通用计算系统有着本质的区别,这种区别不仅体现…...

SVN老手私藏技巧:用‘Revert to this version’优雅回滚,并保留完整修改记录

SVN版本回滚的工程实践:如何安全保留完整修改历史 当线上代码突然崩溃,整个团队盯着红色警报屏住呼吸时,作为技术负责人的你需要的不仅是一个快速修复方案,更是一套可追溯、可审查的完整操作记录。SVN作为经典的版本控制系统&…...

Postman新手必看:一个隐藏的Host勾选框,如何让你的接口测试总报400 Bad Request?

Postman接口测试避坑指南:揭秘Host头缺失引发的400错误 第一次用Postman测试接口就遇到400 Bad Request?别急着怀疑人生,这可能是工具本身的一个隐藏机制在作祟。作为API测试领域的瑞士军刀,Postman在易用性背后藏着不少新手容易踩…...

C#怎么实现全文搜索 C#如何集成Elasticsearch或Lucene.Net实现全文检索功能【数据库】

Lucene.Net最轻量但需手动管理索引生命周期:须单例复用IndexWriter、显式设字段索引、用中文分词器、调Commit()提交,否则易出锁异常或搜不到数据。用 Lucene.Net 做本地全文搜索最轻量,但得自己管索引生命周期直接上手 Lucene.Net 是 C# 里最…...

从HEVC到AV1:聊聊x265源码结构,以及我们该如何高效阅读大型开源编码器

从HEVC到AV1:解码x265源码结构与高效阅读方法论 当第一次打开x265的源码目录时,那种面对数十万行代码的茫然感我至今记忆犹新。作为一个曾经同样困惑的开发者,我完全理解在成功编译后却不知从何下手的挫败感。x265作为目前最成熟的HEVC开源编…...

3步快速完成PDF智能书签:免费工具实现自动PDF导航生成

3步快速完成PDF智能书签:免费工具实现自动PDF导航生成 【免费下载链接】pdfdir PDF导航(大纲/目录)添加工具 项目地址: https://gitcode.com/gh_mirrors/pd/pdfdir 还在为没有书签的PDF电子书而烦恼吗?每次查找章节都要手动…...

APP软件测试:内容与方法剖析

随着移动互联网的迅猛发展,APP软件已成为我们日常生活中不可或缺的一部分。然而,一款优秀的APP不仅要有吸引人的功能和界面设计,更要有出色的稳定性和安全性 。因此,APP软件测试在开发过程中显得尤为重要。本文将全面解析APP软件测…...

别再为STM32显示中文发愁了!手把手教你用W25Q64外挂字库(附完整代码)

STM32外挂字库实战:W25Q64存储与动态加载全解析 在嵌入式设备开发中,中文显示一直是困扰工程师的难题。当使用STM32F103C8T6这类Flash仅有64KB的微控制器时,内置完整中文字库几乎不可能。本文将深入探讨如何利用SPI Flash芯片W25Q64构建外挂字…...

mysql如何设置定时自动备份脚本_编写shell脚本与cron任务

必须加--single-transaction(InnoDB)或--lock-all-tables(MyISAM),并搭配--routines--triggers--events、--default-character-setutf8mb4,密码通过~/.my.cnf(chmod 600)或MYSQL_PWD…...

STM32G474与F334系列HRTIM实战:从CubeMX配置到移相全桥PWM生成

1. HRTIM基础与STM32G474/F334特性解析 HRTIM(High-Resolution Timer)是STMicroelectronics为数字电源和电机控制等应用设计的高精度定时器模块。相比普通定时器,HRTIM最突出的特点是其超高的时钟频率——STM32F334系列可达4.68GHz&#xff0…...

epoll_ctl

1 是什么? epoll_ctl 是 Linux 下高性能 I/O 多路复用(I/O Multiplexing)机制 epoll 的核心控制函数。 你可以把它理解为管理 epoll 监控列表的 "控制中心", 主要作用就是用来 添加、修改或删除 那些被监控的文件描述…...

epoll_event

1 是什么&#xff1f; 在 Linux 系统编程中&#xff0c;epoll_event 是 epoll I/O 多路复用机制的核心数据结构&#xff0c; 定义在 <sys/epoll.h> 头文件中。 它的主要作用是向内核注册需要监听的 I/O 事件&#xff0c; 以及从内核接收已就绪的 I/O 事件。事件注册&…...

拆开Hermes Agent:企业怎么自建一套会“越用越强”的AI Agent系统

如果你这段时间一直在看 Agent 项目&#xff0c;大概率绕不开 Hermes。 它真正吓人的&#xff0c;不只是“能跑命令、能改文件、能开浏览器”。 而是另一件事&#xff1a;它不是一个把大模型外面包了一层工具壳的玩具&#xff0c;而是一套已经把“记忆、技能、协作、执行、回…...

A-RAG 解读:能做好混合检索策略的RAG,才是真 Agentic RAG

市面上的 RAG 系统&#xff0c;不管叫什么名字&#xff0c;本质上只有两种做法&#xff1a; 第一种&#xff0c;一次性检索。把用户的 query 向量化&#xff0c;从语料库里捞出 Top-K 个文档片段&#xff0c;拼成一个大 prompt 塞给模型。GraphRAG、HippoRAG、LightRAG 都属于…...

共建信任基础设施——《知识产权资产成熟度评价认证白皮书》的八大行动倡议与未来展望

以下是《知识产权资产成熟度评价认证白皮书》的第七篇解读文章&#xff0c;聚焦于行动倡议与未来展望。 解读七&#xff1a;共建信任基础设施——《知识产权资产成熟度评价认证白皮书》的八大行动倡议与未来展望 关键词&#xff1a;行动倡议、行业分册、国际标准、AI自动化评…...

Java的java.lang.foreign.MemorySegment数组访问与边界检查在安全API中的保证

Java的java.lang.foreign.MemorySegment作为Project Panama的核心组件&#xff0c;为开发者提供了安全高效的原生内存访问能力。在涉及数组操作时&#xff0c;其严格的边界检查机制成为保障内存安全的关键屏障。本文将深入探讨MemorySegment如何通过设计层面的多重防护&#xf…...

单入射方向光波导耦合光栅的优化

摘要 将光耦合到光波导在现代光学的各种应用中具有重要意义。在VirtualLab Fusion中&#xff0c;使用傅里叶模态法(FMM&#xff0c;也称为RCWA)和参数优化工具&#xff0c;可以优化真实的光栅几何形状&#xff0c;以实现特定衍射级次的最佳耦合效率。本例展示了针对特定入射方…...

FRED应用:准直透镜模拟与优化

1. 摘要 本文您将会学到如下内容&#xff1a; 透镜基本参数输入&#xff1b; 优化变量与评价函数设定&#xff1b; 优化&#xff1b; 照度分析&#xff1b;2. 操作流程1) 创建之前&#xff0c;我们需要设置其喜好&#xff0c;点击菜单Tools>Preference , 注意其红色…...

OCAD应用:利用OCAD进行一般光学系统的设计

填写完对光学系统的设计技术要求之后就可以在窗体右侧的绘图框内绘制光学系统方案草图。绘图框的基本尺寸默认为一张横排的A4图纸。如果根据系统总体尺寸的要求需要调整绘图框图纸图幅的尺寸&#xff0c;可以利用界面是文字框从 “图幅选择”中选择&#xff0c;点击“图幅选择”…...

不止于分频:用FPGA实现一个可配置的N分频模块(支持奇偶,含Testbench)

可配置N分频模块的FPGA工程实践&#xff1a;从参数化设计到验证闭环 在FPGA开发中&#xff0c;时钟管理就像乐队的指挥&#xff0c;协调着各个外设模块的节奏。想象一下这样的场景&#xff1a;你的设计需要同时驱动UART&#xff08;115200波特率&#xff09;、I2C&#xff08;4…...

GraalVM Native Image内存暴增紧急响应清单(含jcmd + native-image-agent + heapdump离线分析三件套)

第一章&#xff1a;GraalVM Native Image内存暴增的典型现象与根因认知当使用 GraalVM 的 native-image 工具将 Java 应用编译为原生可执行文件时&#xff0c;开发者常在构建阶段遭遇 JVM 堆内存急剧飙升&#xff08;如从 2GB 涨至 16GB&#xff09;&#xff0c;甚至触发 OutOf…...

动态内存压缩技术:优化大语言模型显存占用

1. 动态内存压缩技术解析&#xff1a;突破大语言模型部署瓶颈在生成式AI领域&#xff0c;大语言模型(LLM)的部署一直面临内存占用的严峻挑战。以Llama-2-70B模型为例&#xff0c;当处理4096个token的上下文时&#xff0c;仅KV缓存就需要占用约40GB显存&#xff0c;这几乎耗尽了…...

从IL代码级看AI推理卡顿:反编译dotnet publish -r win-x64输出,揪出JIT对SIMD指令生成的3个致命缺陷

第一章&#xff1a;C# .NET 11 AI 模型推理加速 面试题汇总核心考察维度 .NET 11 中 AI 推理加速能力的面试题聚焦于跨层协同优化&#xff0c;包括原生 ONNX Runtime 集成、Span<T>-first 张量操作、JIT-AOT 混合编译策略&#xff0c;以及针对 ARM64/AVX-512 的硬件感知调…...