什么是工作流?
概述
工作流是將一組任務組織起來以完成某個經營過程:定義了任務的觸發順序和觸發條件,每個任務可以由一個或多個軟件系統完成,也可以由一個或一組人完成,還可以由一個或多個人與軟件系統協作完成,
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
文檔
官網地址:https://camunda.com/
中文站點:http://camunda-cn.shaochenfeng.com/
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: demopassword: 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() {// 根據用戶找到關聯的TaskTask task = taskService.createTaskQuery().taskAssignee("demo").singleResult();if (task != null) {// 可更新任務屬性//taskService.setAssignee(task.getId(), "new_assignee");taskService.complete(task.getId());System.out.println("任務審批完成...");}
}