Flowable簡介
Flowable 是一個輕量級的業務流程管理(BPM)和工作流引擎,基于 Activiti 項目發展而來,專注于提供高性能、可擴展的工作流解決方案。它主要用于企業級應用中的流程自動化、任務管理和審批流等場景。
Flowable 的核心特點
- 基于 BPMN 2.0 標準
- 支持使用 BPMN(Business Process Model and Notation) 標準建模業務流程。
- 提供圖形化設計器(如 Flowable Modeler)來設計流程。
- 輕量級 & 可嵌入
- 可以作為庫集成到 Java 應用中,不依賴復雜的外部服務。
- 支持 Spring Boot 快速集成。
- 多種流程管理能力
- 支持 人工任務(User Task)、自動服務任務(Service Task)、定時器(Timer)、子流程(Subprocess) 等。
- 提供 流程實例管理、任務分配、歷史數據查詢 等功能。
- 支持多種數據庫
- 兼容 MySQL、PostgreSQL、Oracle、SQL Server 等關系型數據庫。
- REST API 支持
- 提供 Flowable REST API,方便與其他系統集成。
- 擴展性強
- 支持自定義監聽器(Listeners)、變量(Variables)和腳本(如 Groovy、JavaScript)。
Flowable UI
這里要體驗一下Flowable的功能的話,最方便的是用docker跑一下官方的flowable ui,腳本如下:
docker run -d -p 8080:8080 flowable/flowable-ui
跑起來訪問:http://localhost:8080/flowable-ui/ ,可以看到4個應用:
- 任務應用程序:可以發起流程,處理任務等操作
- 建模器應用程序:圖形化流程設計工具、流程建模
- 管理員應用程式:流程監控和管理控制臺
- 身份管理應用程序:用戶管理
這個主要是體驗一下Flowable的功能,一般我們可能不會在項目上直接用這些應用程序,但是其中一個比較重要的應用建模器應用程序肯定是會用到的,主要是使用它對我們的業務流程進行編排,它使用的是BPMN(Business Process Model and Notation) 標準建模業務流程,提供了圖形化設計器(Flowable Modeler)來設計流程。
雖然idea有插件可以支持BPMN圖形化編輯,但是我并不推薦,可以裝一個查看流程圖,但是編輯我沒有找到多節點任務相關的配置,可能是支持并不完全,所以直接使用官方提供的工具肯定是最好的。
BPMN(Business Process Model and Notation) 是一個標準建模業務流程,不只是Flowable,還有其他的一些工作流引擎同樣是用的這個標準,如:Activiti、Camunda、jBPM等,所以使用以上任意一個工作流引擎都需要了解BPMN建模方法。
以上是我創建的一個請假的審批流程:
- 發起人發起請假流程,填寫姓名、請假天數、理由信息
- 請假天數大于3天則由部門經理審批,請假天數小于3天則由小組leader審批
- 初審通過后由HR審核,這里創建的是多實例用戶節點,可以由多個HR同時審批,任意一個HR操作審核通過即可(或簽)
- 兩次的審核任意一次審核駁回了,就調用服務節點,執行我們的一段Java代碼,這里就是自己去實現發郵件、發短信等等操作
這里就以這么一個流程為例,整合到SpringBoot中,通過提供接口的方式,實現流程的發起、待審核任務的查詢、審核指定任務、回調服務代碼等功能。
flowable-spring-boot-starter
這里用的是flowable-spring-boot-starter
這個starter依賴,版本選用的是7.1.0,對應的JDK17,spring-boot版本3.3.8,數據庫用的MySql 8,添加以下依賴:
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>org.flowable</groupId><artifactId>flowable-spring-boot-starter</artifactId><version>7.1.0</version></dependency>
</dependencies>
配置添加數據庫的連接配置即可,flowable配置基本都有默認值,如果需要修改可以看看flowable流程引擎的自動裝配類ProcessEngineAutoConfiguration
相關的一些配置類FlowableProperties
等
基本不需要做什么其他配置,引入依賴后啟動項目,會自動創建流程引擎相關的表,一共有62張表。
主要的服務類
操作流程引擎最主要使用到的是以下幾個核心的類,可以注入到我們的程序里:
@Resource
private ProcessEngine processEngine;@Resource
private RepositoryService repositoryService;@Resource
private RuntimeService runtimeService;@Resource
private TaskService taskService;
ProcessEngine
用途:Flowable 的核心引擎,是所有服務的入口,用于獲取其他服務實例(如 RepositoryService
、RuntimeService
等)。
RepositoryService
用途:管理 流程定義(Process Definition) 和 部署(Deployment),操作靜態資源(如 BPMN 文件)。
核心功能:
- 部署流程定義(
.bpmn
或.bpmn20.xml
文件)。 - 查詢、刪除流程定義。
- 掛起/激活流程定義。
RuntimeService
用途:管理 流程實例(Process Instance) 和 執行流(Execution),負責流程的啟動與運行時控制。
核心功能:
- 啟動流程實例(基于流程定義)。
- 觸發流程繼續執行(如通過信號事件)。
- 查詢或操作運行中的流程實例。
TaskService
用途:管理 用戶任務(User Task),處理人工審批環節。
核心功能:
- 查詢任務(如待辦任務、已完成任務)。
- 完成任務(提交審批)。
- 分配任務給用戶/組。
- 設置任務變量(如審批意見)。
使用以上的幾個服務類即可完成流程審批的業務流程,具體代碼我已經上傳到github
https://github.com/chengpei/spring-ai-demo
其中flowable-demo模塊就是Flowable流程相關的代碼,其他模塊是spring ai相關的代碼可以忽略。
流程部署
在Flowable UI章節我使用建模器應用程序創建了一個請假的審批流程,在頁面上找到導出到BPMN2按鈕,會下載一個xml文件,里面就是我們定義的流程描述文件,將項目的resources
目錄下新建一個文件夾processes
,將流程描述文件放入到該文件夾下,重啟項目即可,程序會自動讀取該文件夾內的流程自動部署。
如果需要更改文件夾位置,可以修改配置flowable.processDefinitionLocationPrefix
,配置在FlowableProperties
類里
演示代碼
代碼我已經上傳到github
https://github.com/chengpei/spring-ai-demo
主要是FlowableDemoController里的幾個接口,這里就不貼代碼了,直接github中找到項目的flowable-demo模塊,其他模塊是spring ai相關的代碼請忽略,以下是接口調用的示例:
### 發起流程
GET http://localhost:8080/flowable/start?name=zhangsan&days=5&reason=不想上班### 查詢我的任務
GET http://localhost:8080/flowable/queryTask?name=manager&processId=09295702-0877-11f0-a7fe-bafcde6eec46### 任務審核 - 通過
GET http://localhost:8080/flowable/completeTask?taskId=7d7a3749-0876-11f0-a354-bafcde6eec46&outcome=通過
### 任務審核 - 駁回
GET http://localhost:8080/flowable/completeTask?taskId=094f55a1-0877-11f0-a7fe-bafcde6eec46&outcome=駁回### 查看任務流程圖
GET http://localhost:8080/flowable/processDiagram?processId=09295702-0877-11f0-a7fe-bafcde6eec46
跑起來看看代碼調用效果就可以了,也比較簡單,每執行一步可以在游覽器里調用查看任務流程圖接口,看流程執行到哪一步了,其中唯一可能值得說一說的就是HR審核節點,是一個多實例用戶節點
多實例任務節點
上述請假流程中的HR審核接口是一個多實例任務節點,所謂多實例就是該節點的處理人涉及到多人,配置如下:
多實例類型:有并行和串行兩種方式,并行可能用的比較多,一般到這個接口多實例的每個處理人是同時收到這個任務,可以同時處理,這就是并行。
集合(多實例):指向一個流程變量,這個變量可以是一個數組,每個元素就是處理人
元素變量(多實例):類似for循環集合中的每一項,for (var 元素變量 in 集合)
完成條件(多實例):指該多實例節點任務的完成條件,其中涉及以下幾個變量:
- nrOfInstances:實例總數。
- nrOfActiveInstances:當前活動的(即未完成的),實例數量。對于順序多實例,這個值總為1。
- nrOfCompletedInstances:已完成的實例數量。
- loopCounter:給定實例在_for-each循環中的index_。可以通過Flowable的elementIndexVariable屬性為loopCounter變量重命名。
我這里配置的是${nrOfCompletedInstances==1}
,代表多實例節點已完成的實例數量為1就算節點完成,業務上我們稱它為或簽,多個并行的處理人只要有一個處理了就算完成。業務上對應的還有一種會簽,代表多個并行的處理人全部處理了才算完成,可以配置為${nrOfCompletedInstances==nrOfInstances}
參考中文翻譯文檔這個章節:https://tkjohn.github.io/flowable-userguide/#bpmnMultiInstance
參考資料:
官網網站:https://www.flowable.com/open-source
官方文檔:https://www.flowable.com/open-source/docs/oss-introduction
中文翻譯文檔:https://tkjohn.github.io/flowable-userguide/
雖然中文翻譯文檔版本不是最新的,不過基本功能都一樣