SpringBoot集成Flowable實現(xiàn)工作流解讀
一、引言:當業(yè)務流程遇見 Flowable
在企業(yè)級應用中,審批流程是繞不開的核心需求:從請假申請到合同審批,從報銷流程到項目立項,標準化的工作流能顯著提升協(xié)作效率。
傳統(tǒng)硬編碼實現(xiàn)審批邏輯,往往導致代碼臃腫、維護困難,而 Flowable 作為輕量級工作流引擎,與 Spring Boot 的結(jié)合堪稱 “天作之合”。
本文將從 0 到 1 搭建一個完整的審批系統(tǒng),涵蓋流程設計、引擎集成、業(yè)務交互全流程,附可運行的生產(chǎn)級源碼。
二、Flowable 核心概念:重新定義流程管理
1. 三大核心組件
- 流程引擎(Process Engine):
Flowable 的心臟,負責解析流程定義、管理流程實例、調(diào)度任務
- 流程定義(Process Definition):
可視化的流程藍圖,通過 BPMN 2.0 標準定義節(jié)點(開始 / 結(jié)束事件、用戶任務、網(wǎng)關(guān)等)
- 任務(Task):
流程執(zhí)行過程中產(chǎn)生的待辦事項,包含辦理人、截止時間、表單數(shù)據(jù)等屬性
2. 核心優(yōu)勢
- 輕量化:
獨立于 Spring 的引擎實現(xiàn),最小依賴僅 2MB
- 兼容性:
完全兼容 Activiti 5/6 流程文件,支持多數(shù)據(jù)庫(MySQL/PostgreSQL/Oracle)
- 擴展性:
提供 Java API、REST 接口、表單引擎、決策表等擴展模塊
三、實戰(zhàn)準備:搭建開發(fā)環(huán)境
1. 創(chuàng)建 Spring Boot 項目
<!-- pom.xml 依賴 -->
<dependencies>
<!-- Flowable核心依賴 -->
<dependency>
<groupId>org.flowable</groupId>
<artifactId>flowable-spring-boot-starter-process</artifactId>
<version>6.8.0</version>
</dependency>
<!-- 數(shù)據(jù)庫依賴(以MySQL為例) -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- Web模塊 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies> 2. 配置數(shù)據(jù)庫與引擎
# application.yml
spring:
datasource:
url: jdbc:mysql://localhost:3306/flowable_demo?useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: 123456
flowable:
database-schema-update: true # 自動創(chuàng)建/更新數(shù)據(jù)庫表
check-process-definitions: true # 啟動時檢查流程定義
async-executor-activate: false # 禁用異步執(zhí)行器(簡化開發(fā)) 四、流程建模:用 Flowable Designer 畫審批藍圖
1. 設計請假審批流程
節(jié)點說明
- 開始事件(Start Event)
- 用戶任務(User Task):部門經(jīng)理審批
- 排他網(wǎng)關(guān)(Exclusive Gateway):根據(jù)審批結(jié)果分支
- 結(jié)束事件(End Event)
2. 導出流程文件
將設計好的流程保存為 leave-process.bpmn20.xml,放置在 src/main/resources/processes/ 目錄下,核心定義如下:
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL">
<process id="leaveProcess" name="請假流程">
<startEvent id="startEvent" />
<userTask id="managerApproval" name="部門經(jīng)理審批">
<extensionElements>
<flowable:assignee>manager</flowable:assignee> <!-- 辦理人變量 -->
</extensionElements>
</userTask>
<exclusiveGateway id="approvalGate" name="審批結(jié)果" />
<endEvent id="approveEnd" name="審批通過" />
<endEvent id="rejectEnd" name="審批拒絕" />
<!-- 流程連線定義 -->
</process>
</definitions> 五、核心代碼實現(xiàn):從引擎集成到業(yè)務交互
1. 流程服務層(核心邏輯)
import org.flowable.engine.*;
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.task.api.Task;
import org.springframework.stereotype.Service;
@Service
public class LeaveProcessService {
private final ProcessEngine processEngine;
public LeaveProcessService(ProcessEngine processEngine) {
this.processEngine = processEngine;
}
// 1. 發(fā)起請假流程
public String startProcess(String applicant, String reason, int days) {
RuntimeService runtimeService = processEngine.getRuntimeService();
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(
"leaveProcess", // 流程定義Key
"process_" + UUID.randomUUID(), // 流程實例ID
Map.of(
"applicant", applicant, // 流程變量
"reason", reason,
"days", days
)
);
return processInstance.getId();
}
// 2. 處理審批任務
public void completeTask(String taskId, String assignee, boolean approved) {
TaskService taskService = processEngine.getTaskService();
Task task = taskService.createTaskQuery()
.taskId(taskId)
.singleResult();
taskService.claim(taskId, assignee); // 認領(lǐng)任務
taskService.complete(taskId, Map.of("approved", approved)); // 提交審批結(jié)果
}
// 3. 查詢用戶待辦任務
public List<Task> getTasks(String assignee) {
return processEngine.getTaskService()
.createTaskQuery()
.taskAssignee(assignee)
.orderByTaskCreateTime()
.desc()
.list();
}
} 2. 控制器層(REST 接口)
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/process")
public class LeaveProcessController {
private final LeaveProcessService processService;
// 發(fā)起流程
@PostMapping("/start")
public ResponseData startProcess(
@RequestParam String applicant,
@RequestParam String reason,
@RequestParam int days
) {
String processId = processService.startProcess(applicant, reason, days);
return ResponseData.success("流程啟動成功", processId);
}
// 處理任務
@PostMapping("/complete")
public ResponseData completeTask(
@RequestParam String taskId,
@RequestParam String assignee,
@RequestParam boolean approved
) {
processService.completeTask(taskId, assignee, approved);
return ResponseData.success("任務處理完成");
}
// 查詢待辦任務
@GetMapping("/tasks")
public ResponseData getTasks(@RequestParam String assignee) {
List<Task> tasks = processService.getTasks(assignee);
return ResponseData.success("獲取任務成功", tasks);
}
} 3. 數(shù)據(jù)庫表說明
Flowable 自動創(chuàng)建以下核心表(以 MySQL 為例):
表名 | 作用 |
|---|---|
ACT_RE_PROCDEF | 流程定義表 |
ACT_RU_INSTANCE | 運行時流程實例表 |
ACT_RU_TASK | 運行時任務表 |
ACT_HI_PROCINST | 歷史流程實例表 |
ACT_HI_TASKINST | 歷史任務表 |
六、深度解析:Flowable 架構(gòu)與 Spring Boot 的化學反應
1. 引擎初始化流程
- Spring Boot 自動配置:
FlowableAutoConfiguration 注冊核心 Bean(ProcessEngine、RuntimeService 等)
- 數(shù)據(jù)庫初始化:
database-schema-update 自動創(chuàng)建 52 張表,支持四種策略(false/null/true/create-drop)
- 流程定義部署:
啟動時掃描classpath:/processes/目錄,自動部署 BPMN 文件
2. 事務管理機制
- 與 Spring 事務集成:
流程操作(啟動 / 完成任務)自動納入 Spring 事務
- 隔離級別:
通過@Transactional注解控制,默認使用數(shù)據(jù)庫默認隔離級別
- 異常處理:
流程執(zhí)行失敗時自動回滾,歷史表記錄失敗事件
3. 性能優(yōu)化點
// 優(yōu)化查詢性能(添加索引)
@PostConstruct
public void createIndex() {
ManagementService managementService = processEngine.getManagementService();
managementService.createIndex("ACT_IDX_TASK_ASSIGNEE", "ACT_RU_TASK", "ASSIGNEE_");
} 七、生產(chǎn)環(huán)境最佳實踐
1. 流程版本管理
// 部署新版本流程(保留歷史版本)
RepositoryService repositoryService = processEngine.getRepositoryService();
repositoryService.createDeployment()
.name("請假流程V2.0")
.addClasspathResource("processes/leave-process-v2.bpmn20.xml")
.deploy(); 2. 表單集成方案
- 內(nèi)嵌表單:
在 BPMN 中定義flowable:formField,通過TaskService.getTaskFormData()獲取表單元數(shù)據(jù)
- 外置表單:
使用 Flowable Form 引擎,支持 HTML/CSS/JavaScript 自定義表單
3. 監(jiān)控與審計
// 查詢流程執(zhí)行歷史
HistoryService historyService = processEngine.getHistoryService();
List<HistoricProcessInstance> instances = historyService
.createHistoricProcessInstanceQuery()
.processInstanceBusinessKey("process_123")
.list(); 4. 安全加固
- 權(quán)限控制:
通過 Spring Security 限制 API 訪問,流程變量加密存儲
- 防 SQL 注入:
所有用戶輸入?yún)?shù)使用 MyBatis 的#{}占位符,避免拼接 SQL
八、總結(jié):重新定義流程開發(fā)范式
通過 Spring Boot 與 Flowable 的深度集成,我們實現(xiàn)了:
- 可視化流程建模:
業(yè)務人員可獨立設計審批流程,減少技術(shù)依賴
- 低代碼開發(fā):
核心業(yè)務邏輯與流程引擎解耦,代碼量減少 60% 以上
- 全生命周期管理:
從流程啟動到歷史追溯,提供完整的審計能力
在數(shù)字化轉(zhuǎn)型的今天,工作流引擎不再是 “奢侈品”。Flowable 與 Spring Boot 的組合,讓中小企業(yè)也能快速搭建專業(yè)級審批系統(tǒng)。掌握這套技術(shù)棧,不僅能提升開發(fā)效率,更能讓你在企業(yè)架構(gòu)設計中占據(jù)先機 —— 畢竟,清晰的流程,才是高效協(xié)作的基石
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java集合中的CopyOnWriteArrayList使用詳解
這篇文章主要介紹了Java集合中的CopyOnWriteArrayList使用詳解,CopyOnWriteArrayList是ArrayList的線程安全版本,從他的名字可以推測,CopyOnWriteArrayList是在有寫操作的時候會copy一份數(shù)據(jù),然后寫完再設置成新的數(shù)據(jù),需要的朋友可以參考下2023-12-12
SpringBoot實現(xiàn)密碼安全存儲的五種方式小結(jié)
項目開發(fā)中,密碼安全存儲是非常關(guān)鍵的一環(huán),作為開發(fā)者,我們需要確保用戶的密碼在存儲時被安全地加密,避免因數(shù)據(jù)泄露而造成嚴重后果,所以本文給大家介紹了SpringBoot實現(xiàn)密碼安全存儲的5種方式,需要的朋友可以參考下2025-03-03
Java利用Socket實現(xiàn)網(wǎng)絡通信功能
在早期的網(wǎng)絡編程中,Socket是很常見的實現(xiàn)技術(shù)之一,比如早期的聊天室,就是基于這種技術(shù)進行實現(xiàn)的,另外現(xiàn)在有些消息推送,也可以基于Socket實現(xiàn),本文小編給大家介紹了Java利用Socket實現(xiàn)網(wǎng)絡通信功能的示例,需要的朋友可以參考下2023-11-11
Spring Boot4使用Sentinel進行限流的操作方法
Sentinel是阿里巴巴開源的流量控制組件,用于保障微服務架構(gòu)的穩(wěn)定性,它提供了多種規(guī)則類型,本文還介紹了如何在Spring Boot 4中集成Sentinel,以及Sentinel在不同版本的Spring Boot和Spring Cloud中的兼容性情況,感興趣的朋友跟隨小編一起看看吧2025-12-12
Maven pom的distributionManagement配置方式
文章主要介紹了Maven的distributionManagement配置方式,以及它的作用、配置方法和重要性,distributionManagement用于指定構(gòu)件的發(fā)布位置,包括下載URL、狀態(tài)等,文章還詳細解釋了如何配置repository和snapshotRepository,以及它們的用途和區(qū)別2025-01-01

