BPM引擎系列(四) Camunda上手-专业选手的配置与应用
Camunda上手——专业选手的配置与应用系列第四篇Camunda 7 Spring Boot 集成自带 Web 管理界面的企业级 BPM 引擎。一、Camunda 到底专业在哪前面两篇咱们把 Activiti 和 Flowable 都跑通了。但有个问题一直没解决“流程跑起来了但我怎么知道现在有多少个流程在跑卡在哪个节点了谁的任务最多”Activiti 和 Flowable 的答案基本是“自己写SQL查数据库吧。”Camunda 说“不用我自带监控界面。”这就是 Camunda 最大的差异化——它不只是个流程引擎而是个完整的BPM 平台包含组件作用Process Engine流程引擎和Activiti/Flowable类似Cockpit流程监控台看实例、看统计、排错Tasklist任务列表处理待办、审批Admin用户/组管理Modeler流程建模工具桌面版一句话Camunda 引擎 监控 建模工具开箱即用。二、Camunda 7 vs Camunda 8先别搞混在集成之前必须先搞清楚一个容易踩的坑Camunda 有两个大版本架构完全不同特性Camunda 7Camunda 8引擎架构嵌入式和Spring Boot集成独立服务Zeebe部署方式和Java应用一起部署独立集群通过gRPC通信数据库关系型数据库H2/MySQL/PostgreSQL不依赖关系型数据库适用场景传统Java应用、单体/微服务云原生、大规模分布式学习曲线平缓较陡咱们这篇讲的是 Camunda 7因为它和 Spring Boot 集成最自然学习成本最低。Camunda 8 是另一个故事以后有机会再聊。三、Spring Boot 集成 Camunda 73.1 依赖配置pom.xmlpropertiescamunda.version7.19.0/camunda.version/propertiesdependencies!-- Spring Boot Web --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency!-- Camunda Spring Boot Starter WebApp带管理界面 --dependencygroupIdorg.camunda.bpm.springboot/groupIdartifactIdcamunda-bpm-spring-boot-starter-webapp/artifactIdversion${camunda.version}/version/dependency!-- Camunda REST API --dependencygroupIdorg.camunda.bpm.springboot/groupIdartifactIdcamunda-bpm-spring-boot-starter-rest/artifactIdversion${camunda.version}/version/dependency!-- H2 内存数据库 --dependencygroupIdcom.h2database/groupIdartifactIdh2/artifactIdscoperuntime/scope/dependency/dependencies注意Camunda 7 的依赖在 Maven Central 上不需要额外配置仓库比 Activiti 省心。3.2 配置文件application.ymlserver:port:8083spring:datasource:url:jdbc:h2:mem:camunda-db;DB_CLOSE_DELAY-1driver-class-name:org.h2.Driverusername:sapassword:# Camunda 配置camunda.bpm:# 默认管理员账号admin-user:id:demopassword:demofirst-name:Demo# 自动更新数据库表database:schema-update:true# 自动部署流程定义auto-deployment-enabled:truedeployment:resources:classpath:/processes/*.bpmn# 历史记录级别history-level:full# 启用Job执行器处理定时任务、异步任务job-execution:enabled:trueCamunda 特有的配置配置项作用admin-user自动创建管理员账号登录WebApp用auto-deployment-enabled自动部署BPMN文件job-execution.enabled启用后台Job执行器3.3 流程定义文件放到src/main/resources/processes/leave-process.bpmn?xml version1.0 encodingUTF-8?definitionsxmlnshttp://www.omg.org/spec/BPMN/20100524/MODELxmlns:camundahttp://camunda.org/schema/1.0/bpmnprocessidleave-processname请假流程isExecutabletruestartEventidstartname提交申请/userTaskidmanager-approvalname经理审批camunda:assignee${managerId}/exclusiveGatewayidmanager-decisionname经理审批结果/endEventidmanager-reject-endname经理驳回/exclusiveGatewayiddays-checkname天数3?/userTaskiddirector-approvalname总监审批camunda:assignee${directorId}/endEventiddirector-reject-endname总监驳回/!-- Camunda 服务任务用 delegateExpression 引用 Spring Bean --serviceTaskidhr-recordnameHR备案camunda:delegateExpression${hrRecordDelegate}/serviceTaskidsend-emailname发送通知邮件camunda:delegateExpression${sendEmailDelegate}/endEventidendname流程结束/!-- 连线... --/process/definitions注意 Camunda 的命名空间xmlns:camundahttp://camunda.org/schema/1.0/bpmn四、Java代码Camunda 的独特风格Camunda 的 API 和 Activiti/Flowable 大同小异但服务任务的实现方式有区别。4.1 服务任务JavaDelegateCamunda 推荐用JavaDelegate接口实现服务任务Component(hrRecordDelegate)// Bean名称和BPMN里的 ${hrRecordDelegate} 对应publicclassHrRecordDelegateimplementsJavaDelegate{Overridepublicvoidexecute(DelegateExecutionexecution)throwsException{Stringapplicant(String)execution.getVariable(applicant);Integerdays(Integer)execution.getVariable(days);log.info(【HR备案】员工 {} 请假 {} 天已记录到HR系统,applicant,days);}}Component(sendEmailDelegate)publicclassSendEmailDelegateimplementsJavaDelegate{Overridepublicvoidexecute(DelegateExecutionexecution)throwsException{Stringapplicant(String)execution.getVariable(applicant);Stringresult(String)execution.getVariable(result);log.info(【发送邮件】通知 {}你的请假申请已{}请查收,applicant,result);}}BPMN里引用serviceTaskidhr-recordnameHR备案camunda:delegateExpression${hrRecordDelegate}/和 Activiti/Flowable 的区别Activiti/Flowable 常用expression${bean.method(execution)}调用方法Camunda 常用delegateExpression${beanName}引用实现JavaDelegate的 Bean两种方式 Camunda 都支持但JavaDelegate更Camunda风格。4.2 REST API和之前一样启动流程、查待办、完成任务的 API 和 Activiti/Flowable 几乎一样RestControllerRequestMapping(/api/leave)publicclassLeaveController{AutowiredprivateRuntimeServiceruntimeService;AutowiredprivateTaskServicetaskService;PostMapping(/start)publicMapString,ObjectstartProcess(...){...}GetMapping(/tasks)publicListMapString,ObjectgetTasks(...){...}PostMapping(/complete)publicMapString,ObjectcompleteTask(...){...}}完整代码见配套源码这里不重复了。五、Camunda 的王牌Web 管理界面启动应用后访问 http://localhost:8083用demo/demo登录。5.1 Cockpit —— 流程监控台这是最牛的功能路径/camunda/app/cockpit能看到什么流程定义列表部署了哪些流程每个流程有多少实例流程实例详情当前卡在哪个节点高亮显示已经走过的路径变量值点击就能看历史活动记录统计报表流程实例数量趋势平均执行时间节点耗时分析找出瓶颈排错神器流程卡住了打开 Cockpit一眼就能看到卡在哪个任务变量值是什么。5.2 Tasklist —— 任务列表路径/camunda/app/tasklist功能查看个人待办任务完成任务填写表单任务委托、认领虽然咱们项目有自己的 REST API但 Tasklist 可以直接用不用开发前端。5.3 Admin —— 用户管理路径/camunda/app/admin功能创建用户、组分配权限管理授权六、Camunda 特有功能6.1 外部任务External Task这是 Camunda 的一个杀手级特性特别适合微服务架构。传统服务任务的问题服务任务的逻辑和引擎耦合在一起如果服务任务执行时间长会占用引擎资源服务任务挂了流程实例也受影响外部任务的思路引擎只创建外部任务不自己执行外部 Worker 主动拉取任务执行完再报告完成引擎和任务执行解耦// 外部任务客户端可以是一个独立的微服务ComponentpublicclassEmailWorker{PostConstructpublicvoidstartWorker(){ExternalTaskClientclientExternalTaskClient.create().baseUrl(http://localhost:8083/engine-rest).build();client.subscribe(send-email)// 订阅主题.handler((externalTask,externalTaskService)-{StringapplicantexternalTask.getVariable(applicant);StringresultexternalTask.getVariable(result);// 执行邮件发送逻辑sendEmail(applicant,result);// 报告任务完成externalTaskService.complete(externalTask);}).open();}}BPMN里这样定义外部任务serviceTaskidsend-emailname发送通知邮件camunda:typeexternalcamunda:topicsend-email/6.2 DMN 决策表Camunda 支持 DMNDecision Model and Notation可以把业务规则从流程中抽离// 执行决策表DmnDecisionTableResultresultdecisionService.evaluateDecisionTableByKey(leave-approval-rules).variables(variables).evaluate();booleanneedsDirectorApprovalresult.getSingleResult().getEntry(needsDirectorApproval);这样请假天数3需要总监审批这种规则可以写在 DMN 表里不用硬编码在 BPMN 的条件表达式中。业务规则变了只需要改 DMN 表不用改代码。七、跑起来测试7.1 启动应用cdcamunda-demo mvn spring-boot:run端口 8083。7.2 测试API# 启动流程curl-XPOSThttp://localhost:8083/api/leave/start\-dapplicant小明\-dmanagerIdmanager-zhang\-ddirectorIddirector-li\-ddays5# 查待办curlhttp://localhost:8083/api/leave/tasks?assigneemanager-zhang# 完成任务curl-XPOSThttp://localhost:8083/api/leave/complete\-dtaskIdxxx\-dapprovedtrue7.3 打开 Cockpit 看效果浏览器访问 http://localhost:8083登录demo/demo进入 Cockpit → Processes → 请假流程点击流程实例看实时状态你会看到流程图高亮显示当前节点已经走过的路径用绿色标出点击变量标签能看到所有流程变量的值这种可视化的监控能力是 Activiti 和 Flowable 社区版没有的。八、Camunda 的优缺点优点✅ 强大的 Web 管理界面Cockpit/Tasklist/Admin✅ 外部任务模式适合微服务架构✅ 支持 DMN 决策表业务规则可配置化✅ 企业级功能完善多租户、批量操作、历史数据优化✅ 文档极其详细社区活跃缺点❌ 依赖包较大WebApp 带了很多前端资源❌ 学习曲线比 Activiti/Flowable 稍陡❌ 社区版功能足够但企业版Camunda Platform 8更强大有商业版压力❌ Camunda 7 和 8 差异大选型时要注意九、小结这篇咱们聊了Camunda 的定位——不只是引擎是完整的 BPM 平台Camunda 7 vs 8——7适合传统Java应用8适合云原生Spring Boot 集成——依赖、配置、BPMN文件JavaDelegate 服务任务——Camunda 的风格Web 管理界面——Cockpit监控、Tasklist任务处理外部任务和 DMN——微服务友好、规则可配置下一篇预告Activiti、Flowable、Camunda 三剑客都介绍完了到底选哪个咱们来一张对比表帮你做决定。配套源码本文完整源码位于稍后挂链接包含完整的pom.xml和application.yml请假流程 BPMN 定义Camunda 命名空间JavaDelegate 实现类REST API Controller单元测试3个场景全覆盖你用过 Camunda 的 Cockpit 吗觉得监控能力怎么样欢迎交流
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2545131.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!