SpringBoot使用Camunda REST Client调用独立部署的Camunda7

Camunda7及Camunda8都可以独立部署。它可以单独安装运行,或者以Docker镜像的方式运行。那么我们在SprinBoot项目中,就会以"Camunda客户端"的方式,底层以一套RestAPI来与独立运行的Camunda流程引擎进行交互。这样做的好处是,使流程引擎进一步与业务程序解耦,独立运行的流程引擎可以部署在其他服务器(以微服务的形式存在)。

一、下载Camunda7-run

下载地址:https://camunda.com/de/download-camunda-7/

我们根据需要下载对应版本(免费版对应下载社区版):

然后在跳转的树形结构页面中,选择对应的具体版本,本案例下载目前Camunda7系列的最后一个版本"7.24.0"。

二、安装

下载后,将压缩包解压到本地路径,Camunda7独立运行包内容如下:

configuration文件夹中是Camunda7-run的所有配置文件。

internal文件夹是Camunda7-run所需的所有核心包和第三方包。

Windows系统对应使用start.bat、shutdown.bat启动、停止服务。

Linux系统对应使用start.sh、shutdown.sh启动、停止服务。

三、独立运行

我们在windows系统下,直接双击运行"start.bat"。Camunda7-run会自动启动(内部默认使用H2数据库)。

启动时的命令窗口:

启动后自动打开的内部控制台网页:

从控制台页面可见,Camunda7-run提供了4个工具组件:

Tasklist:是任务管理界面,‌ 供最终用户查看和处理待办任务,如审批流程或执行操作;它基于BPMN流程定义显示任务列表,并支持任务分配、查询和完成操作。

‌Cockpit:是流程监控中心,‌ 专为流程管理员和开发人员设计,提供实时流程实例监控、流程定义管理、历史数据查询和数据分析仪表板;用户可在此调试流程、查看执行状态并干预异常流程。‌也在其中进行流程定义部署(Deployments)及对任务(Tasks)的监控管理。

‌Admin:是系统管理后台,‌ 用于系统管理员进行全局配置,如用户和角色管理、权限设置、租户管理等。‌

‌Welcome:页面是入口界面,‌ 在首次访问时显示,引导用户进入其他组件;它可能包含快速链接和平台概览信息。‌

我们点击访问Tasklist,会要求登录:

账号名密码在Camunda7-run的安装目录配置文件中:camunda-bpm-run-7.24.0\configuration\ default.yml

我们可以修改管理员账号(id)及密码(password),也可以在其中修改配置连接到我们指定的数据库(比如mysql8需要将驱动包放入安装目录下的configuration\userlib中)。修改配置文件后需要重启程序生效。

下面是4个管理页面登陆后的截图预览:

  • Tasklist任务管理界面:
  • Cockpit流程监控中心:
  • Admin系统管理后台:
  • Welcome欢迎入口界面(只是提供了各模块入口链接):

四、SpringBoot 中集成Camunda REST CLIENT客户端

Camunda官方提供了Camunda7-run独立部署的Camunda流程引擎程序,相应的也提供了远程操作客户端。

所以,我们的SpringBoot项目本身是可以作为Camunda远程操作客户端,与Camunda7-run服务器进行远程通信(REST API)完成流程操作(部署管理、发起流程、流程管理)的。

同时,我们的SpringBoot项目本身也可以作为Camunda外部任务客户端,与Camunda7-run服务器进行远程通信接收来自服务器的外部任务(任务不在Camunda内部处理,交给作为外部的SpringBoot项目处理)。

1.编写具有外部处理任务的流程

为了远程操作Camunda7-run独立服务器及远程响应外部任务,我们编写一个简单的流程文件。

流程总体属性如下:

外部任务属性如下(本案例不涉及,照填即可):

其中External Task的Topic为外部任务的"标题",客户端来自执行服务器的外部任务时,需按它准确匹配、处理相应任务。

2.SpringBoot 集成Camunda7 REST client,远程管理Camunda服务器

①新建项目,pom.xml中引入依赖包

根据Camunda手册,Camunda7 REST Client SprinBoot依赖包,版本7.24.0对应使用SpringBoot3.5.7。我们在pom.xml中引入相关基础包,最关键的几个包如下(后面会贴出完整代码):

复制代码

②配置application.yml

由于Camunda7 REST Client SprinBoot底层使用Feign实现的REST请求,因此根据官方手册,需要通过feign的配置来指明Camunda7-run服务器的REST API请求路径(后面会贴出完整代码):

复制代码

③编写主类,启用注解

主类启用Camunda7 REST Client注解,开启客户端远程请求Camunda7服务器的能力(后面会贴出完整代码):

复制代码

④编写测试类,编写部署流程方法

复制代码

⑤测试类新增发起流程测试方法

复制代码

⑥运行部署流程、发起流程

部署、发起流程前Camunda Cockpit控制页面截图

上图中,Camunda7-run服务器中,本身自带2个已部署的示例流程,以及有8个已发起的流程实例。

运行测试代码,发起远程创建部署、远程发起流程后Camunda Cockpit控制页面截图:

如图所示,已部署数量变为3,已发起流程实例变为9。

五、完整版代码贴出

1.pom.xml

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.5.7</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.bloom.xian</groupId>
    <artifactId>Camunda7SpringBoot3Client</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>Camunda7SpringBoot3Client</name>
    <description>Camunda7SpringBoot3Client</description>
    <url/>
    <licenses>
        <license/>
    </licenses>
    <developers>
        <developer/>
    </developers>
    <scm>
        <connection/>
        <developerConnection/>
        <tag/>
        <url/>
    </scm>
    <properties>
        <java.version>17</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <!-- springboot作为camunda7服务器的task client依赖包(接收外部任务) -->
        <dependency>
            <groupId>org.camunda.bpm.springboot</groupId>
            <artifactId>camunda-bpm-spring-boot-starter-external-task-client</artifactId>
            <version>7.24.0</version>
        </dependency>

        <!-- camunda-bpm-spring-boot-starter-external-task-client所必须的XML解析包 -->
        <dependency>
            <groupId>jakarta.xml.bind</groupId>
            <artifactId>jakarta.xml.bind-api</artifactId>
            <version>4.0.4</version>
        </dependency>

        <!-- springboot向camunda7服务器发送REST请求的REST client依赖包(发送请求,比如请求上传建立部署、发起流程等) -->
        <dependency>
            <groupId>org.camunda.community.rest</groupId>
            <artifactId>camunda-platform-7-rest-client-spring-boot-starter</artifactId>
            <version>7.24.0</version>
        </dependency>

        <!-- camunda-platform-7-rest-client-spring-boot-starter所必须的Jackson依赖包 -->
        <dependency>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-jsr310</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <annotationProcessorPaths>
                        <path>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </path>
                    </annotationProcessorPaths>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

2.application.yml

XML 复制代码
server:
  port: 8088

spring:
  application:
    name: camunda7-springboot3-client

#当前程序通过feign发送REST API请求camunda7-run独立服务器的配置
feign:
  client:
    config:
      default:
        url: "http://localhost:8080/engine-rest/"

3.SpringBoot启动类

java 复制代码
import org.camunda.community.rest.EnableCamundaRestClient;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;


@EnableCamundaRestClient//打开Camunda REST客户端
@SpringBootApplication
public class MainClass {

    public static void main(String[] args) {
        SpringApplication.run(MainClass.class, args);
    }

}

4.SpringBootTest(jUnit5)

java 复制代码
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.camunda.bpm.engine.RepositoryService;
import org.camunda.bpm.engine.RuntimeService;
import org.camunda.bpm.engine.repository.Deployment;
import org.camunda.bpm.engine.runtime.ProcessInstance;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;

@Slf4j
@SpringBootTest
class MainClassTests {
    @Resource
    @Qualifier("remote")//必须加这个注解,表示这个RepositoryService是"远程的"
    private RepositoryService repositoryService;

    @Resource
    @Qualifier("remote")//引入"远程"RuntimeService
    private RuntimeService runtimeService;

    @Test
    void testCreateDeployment() {
        //下面操作与本地操作完全一样,但会自动发送到远程服务器!
        //通过RepositoryService加载bpmn流程配置文件,并部署至仓库
        Deployment deployment = repositoryService.createDeployment()
                .addClasspathResource("processes/外部任务Camunda7.bpmn")
                .name("外部任务测试流程")//注意:Camunda允许部署名称重复,因此需谨慎!
                .deploy();

        log.info("外部任务测试流程部署id:{}", deployment.getId());
        log.info("外部任务测试流程部署名称:{}", deployment.getName());
    }

    //测试删除一个已部署的流程
    @Test
    public void testDeleteDeployment() {
        //下面操作与本地操作完全一样,但会自动发送到远程服务器!
        //通过部署名称,查找到所有部署
        List<Deployment> deployments = repositoryService.createDeploymentQuery()
                .deploymentName("外部任务测试流程")
                .list();

        //删除所有名为"外部任务测试流程"的部署
        for(Deployment deployment : deployments) {
            //级联删除指定id的已部署流程(第二个参数为true,会同时删除该部署对应的所有流程实例、历史流程实例和作业,确保彻底清理)
            repositoryService.deleteDeployment(deployment.getId(), true);
        }
    }

    @Test
    public void testStartProcessInstance() {
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("Process_EXTERNAL_TEST");

        log.info("发起了一次远程外部任务测试流程,流程实例id:{}", processInstance.getId());
    }
}
相关推荐
幽络源小助理4 小时前
SpringBoot+Vue摄影师分享社区源码 – Java项目免费下载 | 幽络源
java·vue.js·spring boot
+VX:Fegn08955 小时前
计算机毕业设计|基于springboot + vue健身房管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
苹果醋35 小时前
iview— Select— Option选中后有空格
运维·vue.js·spring boot·nginx·课程设计
code_std5 小时前
保存文件到指定位置,读取/删除指定文件夹中文件
java·spring boot·后端
汤姆yu5 小时前
基于springboot的热门文创内容推荐分享系统
java·spring boot·后端
星光一影5 小时前
教育培训机构消课管理系统智慧校园艺术舞蹈美术艺术培训班扣课时教务管理系统
java·spring boot·mysql·vue·mybatis·uniapp
武昌库里写JAVA5 小时前
在iview中使用upload组件上传文件之前先做其他的处理
java·vue.js·spring boot·后端·sql
码界奇点7 小时前
基于Spring Boot的后台管理系统设计与实现
java·spring boot·后端·车载系统·毕业设计·源代码管理