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

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 7

3.1 依赖配置

pom.xml:

<properties><camunda.version>7.19.0</camunda.version></properties><dependencies><!-- Spring Boot Web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Camunda Spring Boot Starter + WebApp(带管理界面) --><dependency><groupId>org.camunda.bpm.springboot</groupId><artifactId>camunda-bpm-spring-boot-starter-webapp</artifactId><version>${camunda.version}</version></dependency><!-- Camunda REST API --><dependency><groupId>org.camunda.bpm.springboot</groupId><artifactId>camunda-bpm-spring-boot-starter-rest</artifactId><version>${camunda.version}</version></dependency><!-- H2 内存数据库 --><dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><scope>runtime</scope></dependency></dependencies>

注意:Camunda 7 的依赖在 Maven Central 上,不需要额外配置仓库,比 Activiti 省心。

3.2 配置文件

application.yml:

server: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:true

Camunda 特有的配置:

配置项作用
admin-user自动创建管理员账号,登录WebApp用
auto-deployment-enabled自动部署BPMN文件
job-execution.enabled启用后台Job执行器

3.3 流程定义文件

放到src/main/resources/processes/leave-process.bpmn

<?xml version="1.0" encoding="UTF-8"?><definitionsxmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"xmlns:camunda="http://camunda.org/schema/1.0/bpmn"><processid="leave-process"name="请假流程"isExecutable="true"><startEventid="start"name="提交申请"/><userTaskid="manager-approval"name="经理审批"camunda:assignee="${managerId}"/><exclusiveGatewayid="manager-decision"name="经理审批结果"/><endEventid="manager-reject-end"name="经理驳回"/><exclusiveGatewayid="days-check"name="天数>3?"/><userTaskid="director-approval"name="总监审批"camunda:assignee="${directorId}"/><endEventid="director-reject-end"name="总监驳回"/><!-- Camunda 服务任务:用 delegateExpression 引用 Spring Bean --><serviceTaskid="hr-record"name="HR备案"camunda:delegateExpression="${hrRecordDelegate}"/><serviceTaskid="send-email"name="发送通知邮件"camunda:delegateExpression="${sendEmailDelegate}"/><endEventid="end"name="流程结束"/><!-- 连线... --></process></definitions>

注意 Camunda 的命名空间xmlns:camunda="http://camunda.org/schema/1.0/bpmn"


四、Java代码:Camunda 的"独特风格"

Camunda 的 API 和 Activiti/Flowable 大同小异,但服务任务的实现方式有区别。

4.1 服务任务:JavaDelegate

Camunda 推荐用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里引用:

<serviceTaskid="hr-record"name="HR备案"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 几乎一样:

@RestController@RequestMapping("/api/leave")publicclassLeaveController{@AutowiredprivateRuntimeServiceruntimeService;@AutowiredprivateTaskServicetaskService;@PostMapping("/start")publicMap<String,Object>startProcess(...){...}@GetMapping("/tasks")publicList<Map<String,Object>>getTasks(...){...}@PostMapping("/complete")publicMap<String,Object>completeTask(...){...}}

完整代码见配套源码,这里不重复了。


五、Camunda 的王牌:Web 管理界面

启动应用后,访问 http://localhost:8083,用demo/demo登录。

5.1 Cockpit —— 流程监控台

这是最牛的功能,路径:/camunda/app/cockpit

能看到什么?

  1. 流程定义列表:部署了哪些流程,每个流程有多少实例
  2. 流程实例详情
    • 当前卡在哪个节点(高亮显示)
    • 已经走过的路径
    • 变量值(点击就能看)
    • 历史活动记录
  3. 统计报表
    • 流程实例数量趋势
    • 平均执行时间
    • 节点耗时分析(找出瓶颈)

排错神器:流程卡住了?打开 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(){ExternalTaskClientclient=ExternalTaskClient.create().baseUrl("http://localhost:8083/engine-rest").build();client.subscribe("send-email")// 订阅主题.handler((externalTask,externalTaskService)->{Stringapplicant=externalTask.getVariable("applicant");Stringresult=externalTask.getVariable("result");// 执行邮件发送逻辑sendEmail(applicant,result);// 报告任务完成externalTaskService.complete(externalTask);}).open();}}

BPMN里这样定义外部任务:

<serviceTaskid="send-email"name="发送通知邮件"camunda:type="external"camunda:topic="send-email"/>

6.2 DMN 决策表

Camunda 支持 DMN(Decision Model and Notation),可以把业务规则从流程中抽离:

// 执行决策表DmnDecisionTableResultresult=decisionService.evaluateDecisionTableByKey("leave-approval-rules").variables(variables).evaluate();booleanneedsDirectorApproval=result.getSingleResult().getEntry("needsDirectorApproval");

这样"请假天数>3需要总监审批"这种规则,可以写在 DMN 表里,不用硬编码在 BPMN 的条件表达式中。业务规则变了,只需要改 DMN 表,不用改代码。


七、跑起来测试

7.1 启动应用

cdcamunda-demo mvn spring-boot:run

端口 8083。

7.2 测试API

# 启动流程curl-XPOST"http://localhost:8083/api/leave/start"\-d"applicant=小明"\-d"managerId=manager-zhang"\-d"directorId=director-li"\-d"days=5"# 查待办curl"http://localhost:8083/api/leave/tasks?assignee=manager-zhang"# 完成任务curl-XPOST"http://localhost:8083/api/leave/complete"\-d"taskId=xxx"\-d"approved=true"

7.3 打开 Cockpit 看效果

  1. 浏览器访问 http://localhost:8083
  2. 登录demo/demo
  3. 进入 Cockpit → Processes → 请假流程
  4. 点击流程实例,看实时状态!

你会看到:

  • 流程图高亮显示当前节点
  • 已经走过的路径用绿色标出
  • 点击变量标签,能看到所有流程变量的值

这种可视化的监控能力,是 Activiti 和 Flowable 社区版没有的。


八、Camunda 的优缺点

优点

  • ✅ 强大的 Web 管理界面(Cockpit/Tasklist/Admin)
  • ✅ 外部任务模式,适合微服务架构
  • ✅ 支持 DMN 决策表,业务规则可配置化
  • ✅ 企业级功能完善(多租户、批量操作、历史数据优化)
  • ✅ 文档极其详细,社区活跃

缺点

  • ❌ 依赖包较大(WebApp 带了很多前端资源)
  • ❌ 学习曲线比 Activiti/Flowable 稍陡
  • ❌ 社区版功能足够,但企业版(Camunda Platform 8)更强大,有商业版压力
  • ❌ Camunda 7 和 8 差异大,选型时要注意

九、小结

这篇咱们聊了:

  1. Camunda 的定位——不只是引擎,是完整的 BPM 平台
  2. Camunda 7 vs 8——7适合传统Java应用,8适合云原生
  3. Spring Boot 集成——依赖、配置、BPMN文件
  4. JavaDelegate 服务任务——Camunda 的风格
  5. Web 管理界面——Cockpit监控、Tasklist任务处理
  6. 外部任务和 DMN——微服务友好、规则可配置

下一篇预告:Activiti、Flowable、Camunda 三剑客都介绍完了,到底选哪个?咱们来一张对比表,帮你做决定。


配套源码

本文完整源码位于:稍后挂链接

包含:

  • 完整的pom.xmlapplication.yml
  • 请假流程 BPMN 定义(Camunda 命名空间)
  • JavaDelegate 实现类
  • REST API Controller
  • 单元测试(3个场景全覆盖)

你用过 Camunda 的 Cockpit 吗?觉得监控能力怎么样?欢迎交流!

http://www.jsqmd.com/news/685377/

相关文章:

  • GaussDB慢SQL排查实战:从告警到定位,手把手教你用这些视图和命令
  • 【2026年华为暑期实习-非AI方向(通软嵌软测试算法数据科学)-4月22日-第一题- 简易的二进制包依赖关系检查和处】(题目+思路+JavaC++Python解析+在线测试)
  • VxWorks核心内核模块:任务管理模块完整解读实践篇(1)
  • Windows系统级输入模拟终极指南:Interceptor库的7个关键技术突破
  • 脉冲神经网络中延迟异质性的计算优势与应用
  • mysql如何设置定时自动备份脚本_编写shell脚本与cron任务
  • 【2026年华为暑期实习-非AI方向(通软嵌软测试算法数据科学)-4月22日-第二题- 硬件布线】(题目+思路+JavaC++Python解析+在线测试)
  • Halcon小技巧:快速找到Region的‘最高点’,搞定工件定位与方向判断
  • 耳挂式ExG设备设计:多模态生物电信号采集技术
  • ChatBI是什么?一文拆解ChatBI应用落地!
  • 全域数学:核素对称能与物质稳定性定量定理(投稿精简版)【乖乖数学】
  • FRED应用:准直透镜模拟与优化
  • BPM引擎系列(五) 三选一-Activiti-vs-Flowable-vs-Camunda选型指南
  • 【2026年华为暑期实习-非AI方向(通软嵌软测试算法数据科学)-4月22日-第三题- 星球大战】(题目+思路+JavaC++Python解析+在线测试)
  • 2026年帮设计师快速生成交互流程的AI工具推荐
  • 自动化测试实践:揭秘WebSocket在接口测试中的应用
  • 3个核心技巧:让DownKyi成为你的B站视频收藏专家
  • 单入射方向光波导耦合光栅的优化
  • SE Office终极指南:如何在浏览器中免费编辑Office文档
  • 告别串口助手:用这款安卓蓝牙调试软件高效调试你的HC-05模块
  • 座椅镀膜厂家哪家好?2026防晒膜/遮阳膜/建筑膜品牌实力分析-优质膜类品牌优选推荐 - 栗子测评
  • 别再为STM32显示中文发愁了!手把手教你用W25Q64外挂字库(附完整代码)
  • 告别‘CScript’报错!Android Studio模拟器驱动安装最全避坑指南(Win10/Win11通用)
  • 灵魂商数(SQ) · 全域数学统一定义【乖乖数学】
  • GraalVM Native Image内存暴增紧急响应清单(含jcmd + native-image-agent + heapdump离线分析三件套)
  • Java的java.lang.foreign.MemorySegment数组访问与边界检查在安全API中的保证
  • 2026六相继电保护测试仪优质品牌推荐:微机保护测试仪、手持式继电保护测试仪、数模一体继电保护测试仪、电缆谐振试验装置选择指南 - 优质品牌商家
  • RK3568设备树与8250驱动实战:将普通UART口改造成智能RS485接口的完整指南
  • APP软件测试:内容与方法剖析
  • FanControl终极指南:5分钟实现Windows风扇精准控制