SpringBoot整合Camunda工作流实践

 更新时间:2025年09月08日 15:13:23   作者:刘火锅  
工作流是任务序列的组织方式,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("任务审批完成...");
    }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 基于Spring概念模型:PathMatcher 路径匹配器

    基于Spring概念模型:PathMatcher 路径匹配器

    这篇文章主要介绍了Spring概念模型:PathMatcher 路径匹配器,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • 一篇文章带你了解Maven的继承和聚合

    一篇文章带你了解Maven的继承和聚合

    这篇文章主要为大家介绍了Maven的继承和聚合,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • log4j使用详细解析

    log4j使用详细解析

    Log4j 除了可以记录程序运行日志信息外还有一重要的功能就是用来显示调试信息。下面通过本文给大家介绍log4j使用详细解析,感兴趣的朋友一起看看吧
    2017-10-10
  • 详解如何将springboot项目导出成war包

    详解如何将springboot项目导出成war包

    这篇文章主要介绍了详解如何将springboot项目导出成war包,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • IntelliJ IDEA中程序包org.slf4j找不到的解决

    IntelliJ IDEA中程序包org.slf4j找不到的解决

    这篇文章主要介绍了IntelliJ IDEA中程序包org.slf4j找不到的解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • Java中try catch处理异常示例

    Java中try catch处理异常示例

    这篇文章主要给大家介绍了关于Java中try catch 的基本用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12
  • Spring DI依赖注入实战教程

    Spring DI依赖注入实战教程

    这篇文章主要介绍了SpringDI依赖注入实战教程,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2024-12-12
  • Mybatis如何使用@Mapper和@MapperScan注解实现映射关系

    Mybatis如何使用@Mapper和@MapperScan注解实现映射关系

    这篇文章主要介绍了Mybatis使用@Mapper和@MapperScan注解实现映射关系,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • SpringBoot中使用@scheduled定时执行任务的坑

    SpringBoot中使用@scheduled定时执行任务的坑

    本文主要介绍了SpringBoot中使用@scheduled定时执行任务的坑,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • 详解java如何集成swagger组件

    详解java如何集成swagger组件

    今天给大家带来的是关于Java的相关知识,文章围绕着java如何集成swagger组件展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06

最新评论