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

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

Activiti入门——老牌引擎还能打吗系列第二篇Activiti 7 Spring Boot 集成实战从配置到跑通一个请假流程。一、ActivitiFlowableCamunda我懵了上篇咱们学完了BPMN信心满满地准备上手干活。结果一搜Java工作流引擎跳出来三个名字ActivitiFlowableCamunda更离谱的是搜Activiti的教程评论区总有人喊别用Activiti了用Flowable搜Flowable又有人说Camunda更专业。问题来了这三个到底啥关系Activiti这个老将还能不能打先上一张族谱图jBPM 3/4 │ ↓ ┌─────────────────┐ │ Activiti 5 │ ← 2010年Tom Baeyens 创建 │ (Alfresco) │ └────────┬────────┘ │ ┌──────────────┼──────────────┐ ↓ ↓ ↓ Activiti 6 Flowable 6 Camunda 7 (维护减少) (原班人马) (更专业) │ │ │ ↓ ↓ ↓ Activiti 7 Flowable 7 Camunda 8 (TOMATO) (活跃开发) (云原生)一句话总结Activiti 是老祖宗但 7 版本之后维护力度下降Flowable 是 Activiti 核心团队分家出来做的更活跃Camunda 也是 Activiti 分支定位更偏向企业级BPM平台那Activiti还能不能用能但更适合以下场景项目已经用了Activiti不想折腾迁移需求简单就是个审批流不需要复杂功能团队对Activiti比较熟悉好不纠结了咱们先把它跑起来再说二、Spring Boot 集成 Activiti2.1 创建项目用 Spring Initializr 创建一个 Spring Boot 项目或者直接在现有项目加依赖。pom.xml 核心依赖parentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.7.18/version/parentpropertiesactiviti.version7.1.0.M6/activiti.version/propertiesdependencies!-- Spring Boot Web --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency!-- Activiti Spring Boot Starter --dependencygroupIdorg.activiti/groupIdartifactIdactiviti-spring-boot-starter/artifactIdversion${activiti.version}/version/dependency!-- H2 内存数据库演示用 --dependencygroupIdcom.h2database/groupIdartifactIdh2/artifactIdscoperuntime/scope/dependency/dependencies⚠️ 注意Activiti 7 的依赖不在 Maven Central需要从 Alfresco 仓库拉取。如果下载失败在 pom.xml 里加一下仓库配置repositoriesrepositoryidalfresco/idurlhttps://artifacts.alfresco.com/nexus/content/repositories/activiti-releases//url/repository/repositories2.2 配置文件application.ymlserver:port:8081spring:datasource:url:jdbc:h2:mem:activiti-db;DB_CLOSE_DELAY-1driver-class-name:org.h2.Driverusername:sapassword:# Activiti 核心配置activiti:# 自动更新数据库表结构database-schema-update:true# 自动检查并部署流程定义文件check-process-definitions:true# 流程定义文件存放位置process-definition-location-prefix:classpath:/processes/# 历史记录级别none/activity/audit/fullhistory-level:full关键配置说明配置项作用database-schema-update自动建表第一次运行必备check-process-definitions启动时自动扫描并部署流程history-level历史数据记录级别full记录最全2.3 流程定义文件把上篇画的请假流程BPMN文件放到src/main/resources/processes/目录下src/main/resources/processes/leave-process.bpmn20.xml文件内容核心片段完整版见配套源码?xml version1.0 encodingUTF-8?definitionsxmlnshttp://www.omg.org/spec/BPMN/20100524/MODELxmlns:activitihttp://activiti.org/bpmntargetNamespacehttp://example.org/leave-processprocessidleave-processname请假流程isExecutabletrue!-- 开始事件 --startEventidstartname提交申请/!-- 经理审批用户任务 --userTaskidmanager-approvalname经理审批activiti:assignee${managerId}/!-- 排他网关经理是否通过 --exclusiveGatewayidmanager-decisionname经理审批结果/!-- 驳回 → 结束 --endEventidmanager-reject-endname经理驳回/!-- 通过 → 检查天数 --exclusiveGatewayiddays-checkname天数3?/!-- 总监审批用户任务 --userTaskiddirector-approvalname总监审批activiti:assignee${directorId}/!-- HR备案服务任务自动执行 --serviceTaskidhr-recordnameHR备案activiti:expression${hrService.record(execution)}/!-- 发送邮件服务任务 --serviceTaskidsend-emailname发送通知邮件activiti:expression${emailService.send(execution)}/!-- 结束事件 --endEventidendname流程结束/!-- 连线 条件表达式... --/process/definitions注意命名空间Activiti 使用activiti:前缀的属性比如activiti:assignee、activiti:expression。三、Java代码启动流程、查待办、完成任务Activiti 的核心 API 就几个 Service记住它们Service作用RuntimeService启动流程、查询运行中的流程实例TaskService查询待办任务、完成任务RepositoryService部署流程定义、查询流程模型HistoryService查询历史数据已完成的流程3.1 启动流程RestControllerRequestMapping(/api/leave)publicclassLeaveController{AutowiredprivateRuntimeServiceruntimeService;PostMapping(/start)publicMapString,ObjectstartProcess(RequestParamStringapplicant,RequestParamStringmanagerId,RequestParamStringdirectorId,RequestParamIntegerdays){// 准备流程变量MapString,ObjectvariablesnewHashMap();variables.put(applicant,applicant);// 申请人variables.put(managerId,managerId);// 经理IDvariables.put(directorId,directorId);// 总监IDvariables.put(days,days);// 请假天数// 启动流程关键就这一行ProcessInstanceinstanceruntimeService.startProcessInstanceByKey(leave-process,variables);returnMap.of(processInstanceId,instance.getId(),message,请假流程已启动);}}关键点startProcessInstanceByKey(leave-process, ...)里的leave-process必须和 BPMN 文件里process idleave-process对应启动时传入的变量applicant、days等可以在整个流程中使用3.2 查询待办任务AutowiredprivateTaskServicetaskService;GetMapping(/tasks)publicListMapString,ObjectgetTasks(RequestParamStringassignee){// 查某个人的待办任务ListTasktaskstaskService.createTaskQuery().taskAssignee(assignee)// 按处理人过滤.list();returntasks.stream().map(task-Map.of(taskId,task.getId(),taskName,task.getName(),processInstanceId,task.getProcessInstanceId())).collect(Collectors.toList());}3.3 完成任务审批PostMapping(/complete)publicMapString,ObjectcompleteTask(RequestParamStringtaskId,RequestParamBooleanapproved){// 设置审批结果变量MapString,ObjectvariablesnewHashMap();variables.put(approved,approved);// true通过, false驳回variables.put(result,approved?通过:驳回);// 完成任务引擎会自动根据条件判断下一步去哪taskService.complete(taskId,variables);returnMap.of(taskId,taskId,message,approved?审批通过:已驳回);}这里有个坑要注意完成任务时传入的approved变量会被网关的条件表达式${approved true}或${approved false}使用。如果变量名写错了网关就不知道怎么走了流程会卡住。四、服务任务自动执行的逻辑流程里有两个服务任务HR备案、发送邮件不需要人处理系统自动执行。Activiti 里实现服务任务有几种方式方式1Spring Bean 表达式推荐Service(hrService)// Bean名称要和BPMN里的 ${hrService.record(execution)} 对应publicclassHrService{publicvoidrecord(DelegateExecutionexecution){// 从流程变量里取数据Stringapplicant(String)execution.getVariable(applicant);Integerdays(Integer)execution.getVariable(days);log.info(【HR备案】员工 {} 请假 {} 天已记录,applicant,days);// 实际这里可以调用HR系统的API}}BPMN里这样引用serviceTaskidhr-recordnameHR备案activiti:expression${hrService.record(execution)}/方式2JavaDelegate 接口ComponentpublicclassHrRecordDelegateimplementsJavaDelegate{Overridepublicvoidexecute(DelegateExecutionexecution){// 同样的逻辑}}BPMN里这样引用serviceTaskidhr-recordnameHR备案activiti:classcom.example.HrRecordDelegate/两种方式的区别表达式方式可以调用Spring管理的Bean支持传参更灵活JavaDelegate方式每次执行都创建新实例除非用Spring代理适合无状态逻辑推荐用表达式方式和Spring结合更紧密。五、跑起来完整测试流程5.1 启动应用mvn spring-boot:run启动日志里你会看到 Activiti 自动创建了几十张表Activiti Engine create activiti tables5.2 测试APIStep 1启动请假流程curl-XPOSThttp://localhost:8081/api/leave/start\-dapplicant小明\-dmanagerIdmanager-zhang\-ddirectorIddirector-li\-ddays5返回{processInstanceId:2501,message:请假流程已启动}Step 2经理查待办curlhttp://localhost:8081/api/leave/tasks?assigneemanager-zhang返回[{taskId:2505,taskName:经理审批,processInstanceId:2501}]Step 3经理审批通过curl-XPOSThttp://localhost:8081/api/leave/complete\-dtaskId2505\-dapprovedtrueStep 4总监查待办因为天数53需要总监审批curlhttp://localhost:8081/api/leave/tasks?assigneedirector-li返回[{taskId:2510,taskName:总监审批,processInstanceId:2501}]Step 5总监审批通过curl-XPOSThttp://localhost:8081/api/leave/complete\-dtaskId2510\-dapprovedtrue这时候日志会输出【HR备案】员工 小明 请假 5 天已记录到HR系统 【发送邮件】通知 小明你的请假申请已通过请查收流程结束六、数据库表速览Activiti 自动创建的表很多但核心就几类表前缀说明常用表ACT_RE_*流程定义RepositoryACT_RE_PROCDEF流程定义ACT_RU_*运行时数据RuntimeACT_RU_TASK待办任务ACT_RU_EXECUTION执行实例ACT_HI_*历史数据HistoryACT_HI_PROCINST历史流程实例ACT_HI_TASKINST历史任务ACT_ID_*身份数据IdentityACT_ID_USER用户ACT_ID_GROUP用户组一个查询小技巧想看当前有哪些待办任务直接查ACT_RU_TASKSELECTID_,NAME_,ASSIGNEE_,PROC_INST_ID_FROMACT_RU_TASK;七、Activiti 的优缺点优点✅ 历史悠久文档和教程多✅ API 设计简洁上手快✅ 和 Spring 集成成熟✅ 社区版免费缺点❌ Activiti 7 之后维护力度下降❌ 部分高级功能如动态表单、CMMN案例管理支持较弱❌ 没有内置的Web管理界面Camunda有Cockpit八、小结这篇咱们聊了Activiti 的身世——老牌引擎Flowable和Camunda的老祖宗Spring Boot 集成——加依赖、配YAML、放BPMN文件核心API——RuntimeService启动流程TaskService查待办/完成任务服务任务——用Spring Bean表达式实现自动逻辑完整测试——从启动到结束一步步跑通下一篇预告Activiti 原班人马分家做出来的Flowable到底升级了啥迁移成本高吗咱们代码里见分晓。配套源码本文完整源码位于02-activiti-demo/包含完整的pom.xml和application.yml请假流程 BPMN 定义REST API Controller服务任务实现单元测试3个场景全覆盖你在用 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 的硬件感知调…...

如何处理SQL查询中的逻辑非操作_使用NOT语法排除

...