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());
}
}