SpringBoot整合Camunda工作流实践
作者:刘火锅
工作流是任务序列的组织方式,BPMN是业务流程建模标准,Activiti、Flowable、Camunda均源自JBPM,通过分叉发展形成不同技术路线,支持多种数据库,且可与SpringBoot集成部署流程
什么是工作流?
概述:
- 工作流是将一组任务组织起来以完成某个经营过程:
- 定义了任务的触发顺序和触发条件,每个任务可以由一个或多个软件系统完成,也可以由一个或一组人完成,还可以由一个或多个人与软件系统协作完成,
BPM
- BPM(Business Process Management,业务流程管理),是一套系统的管理方法论和学科。
- 它强调以“流程”为视角来设计、执行、管理和优化企业的各种业务活动,其最终目标是提高组织效率、增强敏捷性并实现战略目标。
BPMN
- BPMN(Business Process Model and Notation,业务流程模型与标记)是一套全球通用的标准图形符号和规范,由对象管理组织(OMG)维护。
- 它是为 BPM 方法论中的“建模”阶段服务的具体工具。
- BPMN2.0正式版本于2011年1月3日发布,目前常见的工作流引擎如:Activiti、Flowable、Camunda都基于 BPMN 2.0 标准。
Activiti、Flowable、Camunda有什么区别?
概述:
- Activiti、Flowable、Camunda都是从JBPM中诞生出来,jBPM4发展了1年出现了Activiti5,Activiti5发展了几年后第一次分叉出现了Camunda,第二次分叉出现了Flowable。
Camunda
- 2013年:因团队对 Activiti 发展方向分歧(如商业化策略),部分核心成员(包括 Tom Baeyens)离开 Alfresco,创建 Camunda,延续 Activiti 5 代码分支,保留 PVM 架构。
Flowable
- 2016年:Activiti 6 开发团队因与 Salaboy 团队(主导 Activiti 7)理念不合,分叉 Activiti 6 代码创建 Flowable。
- 移除 PVM,重构引擎内核,强化异步机制和多模型支持(BPMN/CMMN/DMN)
支持的数据库:
MySQL
- Activiti 支持但未明确具体版本;
- Flowable 支持 5.6 和 5.7;
- Camunda 也支持 5.7、 8.0。
Oracle
- Activiti 支持但未明确版本;
- Flowable 支持 10g、11g 和 12c;
- Camunda 支持 12c 、19c。
PostgreSQL
- Activiti 支持但未明确版本;
- Flowable 支持 9.1、9.3、9.4、9.6 和 10.4;
- Camunda 支持 9.6、 10 、 11、 12、13。
SQL Server
- Activiti 支持但未明确版本;
- Flowable 支持 2008 R2、2012、2014 和 2016;
- Camunda 支持2014 、 2016 、 2017、 2019。
DB2
- Activiti 支持但未明确版本;
- Flowable 支持 9.7、10.1、10.5 和 11.1;
- Camunda 支持 11.1。
H2
- Activiti 将其作为默认数据库支持;
- Flowable 和 Camunda 均支持 1.4 版本。
MariaDB
- Activiti 未明确提及是否支持;
- Flowable 明确不支持;
- Camunda 支持 10.2 和 10.3 版本。
Camunda
文档:
Camunda Modele
- Camunda Modeler 是Camunda 官方提供的一个流程设计器,用于编辑流程图以及其他模型【表单】,也就是一个流程图的绘图工具

Camunda BPM
- Camunda BPM 是Camunda官方提供的一个业务流程管理平台,用来管理,部署的流程定义、执行任务,策略等。
- 解压文件后,执行名为start.bat脚本,打开浏览器访问http://localhost:8080/进入欢迎页面,Camunda的管理平台。

核心表结构
- ACT_GE_:表示流程通用数据,用于不同场景下。
- ACT_RE_:表示流程资源存储,这个前缀的表包含了流程定义和流程静态资源(图片,规则等)。
- ACT_RU_:表示流程运行时。这些运行时的表,包含流程实例,任务,变量,Job等运行中的数据。 Camunda只在流程实例执行过程中保存这些数据,在流程结束时就会删除这些记录, 这样运行时表的数据量最小,可以最快运行。
- ACT_ID_:表示组织用户信息,比如用户,组等。
- ACT_HI_*:表示流程历史记录。这些表包含历史数据,比如历史流程实例,变量,任务等。
SpringBoot整合Camunda示例
Spring Boot 版本和Camunda版本兼容
Spring Boot 版本和Camunda版本之间不匹配,会出现各种意想不到的错误,具体版本兼容可参照官方文档

Demo示例
- 相关的pom.xml中的依赖
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mshb.workflow</groupId>
<artifactId>camunda-msb-demo</artifactId>
<version>1.0.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>3.2.2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.camunda.bpm</groupId>
<artifactId>camunda-bom</artifactId>
<version>7.21.0</version>
<scope>import</scope>
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.camunda.bpm.springboot</groupId>
<artifactId>camunda-bpm-spring-boot-starter-rest</artifactId>
</dependency>
<dependency>
<groupId>org.camunda.bpm.springboot</groupId>
<artifactId>camunda-bpm-spring-boot-starter-webapp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>org.camunda.bpm</groupId>
<artifactId>camunda-engine-plugin-spin</artifactId>
</dependency>
<dependency>
<groupId>org.camunda.spin</groupId>
<artifactId>camunda-spin-dataformat-all</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>3.2.2</version>
</plugin>
</plugins>
</build>
</project>
- 配置文件信息
spring.datasource.url: jdbc:h2:file:./camunda-h2-database camunda.bpm.admin-user: id: demo password: demo
- 部署流程
通过启动类启动,访问http://localhost:8080/camunda/可登录camunda控制台界面
public void deploy() {
Deployment deploy = repositoryService.createDeployment()
.name("发起支付流程") // 定义部署文件的名称
.addClasspathResource("payment.bpmn") // 绑定需要部署的流程文件
.deploy();// 部署流程
}
- 启动流程
public void startFlow() {
// 创建流程变量集合
Map<String, Object> variables = new HashMap<>();
// 添加支付相关参数(类型自动推断)
variables.put("amount", 2999); // 整数类型
variables.put("item", "Premium Package");// 字符串类型
variables.put("approved", true); // 布尔类型
// 部署流程
ProcessInstance processInstance = runtimeService
.startProcessInstanceByKey("Payment-gateway", variables);
if (processInstance != null) {
// 部署的流程实例的相关信息
System.out.println("processInstance.getId() = " + processInstance.getId());
System.out.println("processInstance.getProcessDefinitionId() = " + processInstance.getProcessDefinitionId());
// 验证变量已注入(可选)
Map<String, Object> actualVars = runtimeService.getVariables(processInstance.getId());
System.out.println("流程变量: " + actualVars);
} else {
System.out.println("流程启动失败");
}
}
- 查询待办
public void queryTask() {
List<Task> list = taskService.createTaskQuery()
.taskAssignee("demo")
.list();
if (list != null && !list.isEmpty()) {
for (Task task : list) {
System.out.println("task.getId() = " + task.getId());
System.out.println("task.getAssignee() = " + task.getAssignee());
}
}
}
- 完成任务
public void completeTask() {
// 根据用户找到关联的Task
Task task = taskService.createTaskQuery()
.taskAssignee("demo")
.singleResult();
if (task != null) {
// 可更新任务属性
//taskService.setAssignee(task.getId(), "new_assignee");
taskService.complete(task.getId());
System.out.println("任务审批完成...");
}
}
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
