java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > SpringBoot整合Camunda工作流

SpringBoot整合Camunda工作流实践

作者:刘火锅

工作流是任务序列的组织方式,BPMN是业务流程建模标准,Activiti、Flowable、Camunda均源自JBPM,通过分叉发展形成不同技术路线,支持多种数据库,且可与SpringBoot集成部署流程

什么是工作流?

概述:

BPM

BPMN

Activiti、Flowable、Camunda有什么区别?

概述:

Camunda

Flowable

支持的数据库:

MySQL

Oracle

PostgreSQL

SQL Server

DB2

H2

MariaDB

Camunda

文档:

Camunda Modele

Camunda BPM

核心表结构

SpringBoot整合Camunda示例

Spring Boot 版本和Camunda版本兼容

Spring Boot 版本和Camunda版本之间不匹配,会出现各种意想不到的错误,具体版本兼容可参照官方文档

Demo示例

<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("任务审批完成...");
    }
}

总结

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

您可能感兴趣的文章:
阅读全文