SpringBoot整合Camunda工作流實(shí)踐
什么是工作流?
概述:
- 工作流是將一組任務(wù)組織起來以完成某個(gè)經(jīng)營過程:
- 定義了任務(wù)的觸發(fā)順序和觸發(fā)條件,每個(gè)任務(wù)可以由一個(gè)或多個(gè)軟件系統(tǒng)完成,也可以由一個(gè)或一組人完成,還可以由一個(gè)或多個(gè)人與軟件系統(tǒng)協(xié)作完成,
BPM
- BPM(Business Process Management,業(yè)務(wù)流程管理),是一套系統(tǒng)的管理方法論和學(xué)科。
- 它強(qiáng)調(diào)以“流程”為視角來設(shè)計(jì)、執(zhí)行、管理和優(yōu)化企業(yè)的各種業(yè)務(wù)活動(dòng),其最終目標(biāo)是提高組織效率、增強(qiáng)敏捷性并實(shí)現(xiàn)戰(zhàn)略目標(biāo)。
BPMN
- BPMN(Business Process Model and Notation,業(yè)務(wù)流程模型與標(biāo)記)是一套全球通用的標(biāo)準(zhǔn)圖形符號(hào)和規(guī)范,由對(duì)象管理組織(OMG)維護(hù)。
- 它是為 BPM 方法論中的“建模”階段服務(wù)的具體工具。
- BPMN2.0正式版本于2011年1月3日發(fā)布,目前常見的工作流引擎如:Activiti、Flowable、Camunda都基于 BPMN 2.0 標(biāo)準(zhǔn)。
Activiti、Flowable、Camunda有什么區(qū)別?
概述:
- Activiti、Flowable、Camunda都是從JBPM中誕生出來,jBPM4發(fā)展了1年出現(xiàn)了Activiti5,Activiti5發(fā)展了幾年后第一次分叉出現(xiàn)了Camunda,第二次分叉出現(xiàn)了Flowable。
Camunda
- 2013年:因團(tuán)隊(duì)對(duì) Activiti 發(fā)展方向分歧(如商業(yè)化策略),部分核心成員(包括 Tom Baeyens)離開 Alfresco,創(chuàng)建 Camunda,延續(xù) Activiti 5 代碼分支,保留 PVM 架構(gòu)。
Flowable
- 2016年:Activiti 6 開發(fā)團(tuán)隊(duì)因與 Salaboy 團(tuán)隊(duì)(主導(dǎo) Activiti 7)理念不合,分叉 Activiti 6 代碼創(chuàng)建 Flowable。
- 移除 PVM,重構(gòu)引擎內(nèi)核,強(qiáng)化異步機(jī)制和多模型支持(BPMN/CMMN/DMN)
支持的數(shù)據(jù)庫:
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 將其作為默認(rèn)數(shù)據(jù)庫支持;
- Flowable 和 Camunda 均支持 1.4 版本。
MariaDB
- Activiti 未明確提及是否支持;
- Flowable 明確不支持;
- Camunda 支持 10.2 和 10.3 版本。
Camunda
文檔:
- 官網(wǎng)地址:https://camunda.com/
- 中文站點(diǎn):http://camunda-cn.shaochenfeng.com/
Camunda Modele
- Camunda Modeler 是Camunda 官方提供的一個(gè)流程設(shè)計(jì)器,用于編輯流程圖以及其他模型【表單】,也就是一個(gè)流程圖的繪圖工具

Camunda BPM
- Camunda BPM 是Camunda官方提供的一個(gè)業(yè)務(wù)流程管理平臺(tái),用來管理,部署的流程定義、執(zhí)行任務(wù),策略等。
- 解壓文件后,執(zhí)行名為start.bat腳本,打開瀏覽器訪問http://localhost:8080/進(jìn)入歡迎頁面,Camunda的管理平臺(tái)。

核心表結(jié)構(gòu)
- ACT_GE_:表示流程通用數(shù)據(jù),用于不同場景下。
- ACT_RE_:表示流程資源存儲(chǔ),這個(gè)前綴的表包含了流程定義和流程靜態(tài)資源(圖片,規(guī)則等)。
- ACT_RU_:表示流程運(yùn)行時(shí)。這些運(yùn)行時(shí)的表,包含流程實(shí)例,任務(wù),變量,Job等運(yùn)行中的數(shù)據(jù)。 Camunda只在流程實(shí)例執(zhí)行過程中保存這些數(shù)據(jù),在流程結(jié)束時(shí)就會(huì)刪除這些記錄, 這樣運(yùn)行時(shí)表的數(shù)據(jù)量最小,可以最快運(yùn)行。
- ACT_ID_:表示組織用戶信息,比如用戶,組等。
- ACT_HI_*:表示流程歷史記錄。這些表包含歷史數(shù)據(jù),比如歷史流程實(shí)例,變量,任務(wù)等。
SpringBoot整合Camunda示例
Spring Boot 版本和Camunda版本兼容
Spring Boot 版本和Camunda版本之間不匹配,會(huì)出現(xiàn)各種意想不到的錯(cuò)誤,具體版本兼容可參照官方文檔

Demo示例
- 相關(guān)的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
- 部署流程
通過啟動(dòng)類啟動(dòng),訪問http://localhost:8080/camunda/可登錄camunda控制臺(tái)界面
public void deploy() {
Deployment deploy = repositoryService.createDeployment()
.name("發(fā)起支付流程") // 定義部署文件的名稱
.addClasspathResource("payment.bpmn") // 綁定需要部署的流程文件
.deploy();// 部署流程
}
- 啟動(dòng)流程
public void startFlow() {
// 創(chuàng)建流程變量集合
Map<String, Object> variables = new HashMap<>();
// 添加支付相關(guān)參數(shù)(類型自動(dòng)推斷)
variables.put("amount", 2999); // 整數(shù)類型
variables.put("item", "Premium Package");// 字符串類型
variables.put("approved", true); // 布爾類型
// 部署流程
ProcessInstance processInstance = runtimeService
.startProcessInstanceByKey("Payment-gateway", variables);
if (processInstance != null) {
// 部署的流程實(shí)例的相關(guān)信息
System.out.println("processInstance.getId() = " + processInstance.getId());
System.out.println("processInstance.getProcessDefinitionId() = " + processInstance.getProcessDefinitionId());
// 驗(yàn)證變量已注入(可選)
Map<String, Object> actualVars = runtimeService.getVariables(processInstance.getId());
System.out.println("流程變量: " + actualVars);
} else {
System.out.println("流程啟動(dòng)失敗");
}
}
- 查詢待辦
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());
}
}
}
- 完成任務(wù)
public void completeTask() {
// 根據(jù)用戶找到關(guān)聯(lián)的Task
Task task = taskService.createTaskQuery()
.taskAssignee("demo")
.singleResult();
if (task != null) {
// 可更新任務(wù)屬性
//taskService.setAssignee(task.getId(), "new_assignee");
taskService.complete(task.getId());
System.out.println("任務(wù)審批完成...");
}
}
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
在springboot中攔截器Filter中注入bean失敗問題及解決
這篇文章主要介紹了在springboot中攔截器Filter中注入bean失敗問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
Java并發(fā)編程之詳解CyclicBarrier線程同步
在之前的文章中已經(jīng)為大家介紹了java并發(fā)編程的工具:BlockingQueue接口,ArrayBlockingQueue,DelayQueue,LinkedBlockingQueue,PriorityBlockingQueue,SynchronousQueue,BlockingDeque接口,ConcurrentHashMap,CountDownLatch,本文為系列文章第十篇,需要的朋友可以參考下2021-06-06
java中rss解析器(rome.jar和jdom.jar)示例
這篇文章主要介紹了java中rss解析器(rome.jar和jdom.jar)示例,需要的朋友可以參考下2014-03-03
解決springboot中配置過濾器以及可能出現(xiàn)的問題
這篇文章主要介紹了解決springboot中配置過濾器以及可能出現(xiàn)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-09-09
Springboot 整合 Java DL4J 打造文本摘要生成系統(tǒng)
本文介紹了如何使用SpringBoot整合JavaDeeplearning4j構(gòu)建文本摘要生成系統(tǒng),該系統(tǒng)能夠自動(dòng)從長篇文本中提取關(guān)鍵信息,生成簡潔的摘要,幫助用戶快速了解文本的主要內(nèi)容,技術(shù)實(shí)現(xiàn)包括使用LSTM神經(jīng)網(wǎng)絡(luò)進(jìn)行模型構(gòu)建和訓(xùn)練,并通過SpringBoot集成RESTfulAPI接口2024-11-11
使用Java反射機(jī)制提高SpringBoot的代碼質(zhì)量和可維護(hù)性
保持好的代碼質(zhì)量和遵守編碼標(biāo)準(zhǔn)是開發(fā)可維護(hù)和健壯軟件的重要方面,在本文中,我們將探討如何使用 Java 反射來提高 Spring Boot 應(yīng)用程序的代碼質(zhì)量和可維護(hù)性,需要的朋友可以參考下2023-10-10

