SpringBoot集成Flowable實(shí)現(xiàn)工作流解讀
一、引言:當(dāng)業(yè)務(wù)流程遇見 Flowable
在企業(yè)級(jí)應(yīng)用中,審批流程是繞不開的核心需求:從請(qǐng)假申請(qǐng)到合同審批,從報(bào)銷流程到項(xiàng)目立項(xiàng),標(biāo)準(zhǔn)化的工作流能顯著提升協(xié)作效率。
傳統(tǒng)硬編碼實(shí)現(xiàn)審批邏輯,往往導(dǎo)致代碼臃腫、維護(hù)困難,而 Flowable 作為輕量級(jí)工作流引擎,與 Spring Boot 的結(jié)合堪稱 “天作之合”。
本文將從 0 到 1 搭建一個(gè)完整的審批系統(tǒng),涵蓋流程設(shè)計(jì)、引擎集成、業(yè)務(wù)交互全流程,附可運(yùn)行的生產(chǎn)級(jí)源碼。
二、Flowable 核心概念:重新定義流程管理
1. 三大核心組件
- 流程引擎(Process Engine):
Flowable 的心臟,負(fù)責(zé)解析流程定義、管理流程實(shí)例、調(diào)度任務(wù)
- 流程定義(Process Definition):
可視化的流程藍(lán)圖,通過 BPMN 2.0 標(biāo)準(zhǔn)定義節(jié)點(diǎn)(開始 / 結(jié)束事件、用戶任務(wù)、網(wǎng)關(guān)等)
- 任務(wù)(Task):
流程執(zhí)行過程中產(chǎn)生的待辦事項(xiàng),包含辦理人、截止時(shí)間、表單數(shù)據(jù)等屬性
2. 核心優(yōu)勢(shì)
- 輕量化:
獨(dú)立于 Spring 的引擎實(shí)現(xiàn),最小依賴僅 2MB
- 兼容性:
完全兼容 Activiti 5/6 流程文件,支持多數(shù)據(jù)庫(kù)(MySQL/PostgreSQL/Oracle)
- 擴(kuò)展性:
提供 Java API、REST 接口、表單引擎、決策表等擴(kuò)展模塊
三、實(shí)戰(zhàn)準(zhǔn)備:搭建開發(fā)環(huán)境
1. 創(chuàng)建 Spring Boot 項(xiàng)目
<!-- pom.xml 依賴 -->
<dependencies>
<!-- Flowable核心依賴 -->
<dependency>
<groupId>org.flowable</groupId>
<artifactId>flowable-spring-boot-starter-process</artifactId>
<version>6.8.0</version>
</dependency>
<!-- 數(shù)據(jù)庫(kù)依賴(以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ù)庫(kù)與引擎
# 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 # 自動(dòng)創(chuàng)建/更新數(shù)據(jù)庫(kù)表
check-process-definitions: true # 啟動(dòng)時(shí)檢查流程定義
async-executor-activate: false # 禁用異步執(zhí)行器(簡(jiǎn)化開發(fā)) 四、流程建模:用 Flowable Designer 畫審批藍(lán)圖
1. 設(shè)計(jì)請(qǐng)假審批流程
節(jié)點(diǎn)說明
- 開始事件(Start Event)
- 用戶任務(wù)(User Task):部門經(jīng)理審批
- 排他網(wǎng)關(guān)(Exclusive Gateway):根據(jù)審批結(jié)果分支
- 結(jié)束事件(End Event)
2. 導(dǎo)出流程文件
將設(shè)計(jì)好的流程保存為 leave-process.bpmn20.xml,放置在 src/main/resources/processes/ 目錄下,核心定義如下:
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL">
<process id="leaveProcess" name="請(qǐng)假流程">
<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> 五、核心代碼實(shí)現(xiàn):從引擎集成到業(yè)務(wù)交互
1. 流程服務(wù)層(核心邏輯)
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ā)起請(qǐng)假流程
public String startProcess(String applicant, String reason, int days) {
RuntimeService runtimeService = processEngine.getRuntimeService();
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(
"leaveProcess", // 流程定義Key
"process_" + UUID.randomUUID(), // 流程實(shí)例ID
Map.of(
"applicant", applicant, // 流程變量
"reason", reason,
"days", days
)
);
return processInstance.getId();
}
// 2. 處理審批任務(wù)
public void completeTask(String taskId, String assignee, boolean approved) {
TaskService taskService = processEngine.getTaskService();
Task task = taskService.createTaskQuery()
.taskId(taskId)
.singleResult();
taskService.claim(taskId, assignee); // 認(rèn)領(lǐng)任務(wù)
taskService.complete(taskId, Map.of("approved", approved)); // 提交審批結(jié)果
}
// 3. 查詢用戶待辦任務(wù)
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("流程啟動(dòng)成功", processId);
}
// 處理任務(wù)
@PostMapping("/complete")
public ResponseData completeTask(
@RequestParam String taskId,
@RequestParam String assignee,
@RequestParam boolean approved
) {
processService.completeTask(taskId, assignee, approved);
return ResponseData.success("任務(wù)處理完成");
}
// 查詢待辦任務(wù)
@GetMapping("/tasks")
public ResponseData getTasks(@RequestParam String assignee) {
List<Task> tasks = processService.getTasks(assignee);
return ResponseData.success("獲取任務(wù)成功", tasks);
}
} 3. 數(shù)據(jù)庫(kù)表說明
Flowable 自動(dòng)創(chuàng)建以下核心表(以 MySQL 為例):
表名 | 作用 |
|---|---|
ACT_RE_PROCDEF | 流程定義表 |
ACT_RU_INSTANCE | 運(yùn)行時(shí)流程實(shí)例表 |
ACT_RU_TASK | 運(yùn)行時(shí)任務(wù)表 |
ACT_HI_PROCINST | 歷史流程實(shí)例表 |
ACT_HI_TASKINST | 歷史任務(wù)表 |
六、深度解析:Flowable 架構(gòu)與 Spring Boot 的化學(xué)反應(yīng)
1. 引擎初始化流程
- Spring Boot 自動(dòng)配置:
FlowableAutoConfiguration 注冊(cè)核心 Bean(ProcessEngine、RuntimeService 等)
- 數(shù)據(jù)庫(kù)初始化:
database-schema-update 自動(dòng)創(chuàng)建 52 張表,支持四種策略(false/null/true/create-drop)
- 流程定義部署:
啟動(dòng)時(shí)掃描classpath:/processes/目錄,自動(dòng)部署 BPMN 文件
2. 事務(wù)管理機(jī)制
- 與 Spring 事務(wù)集成:
流程操作(啟動(dòng) / 完成任務(wù))自動(dòng)納入 Spring 事務(wù)
- 隔離級(jí)別:
通過@Transactional注解控制,默認(rèn)使用數(shù)據(jù)庫(kù)默認(rèn)隔離級(jí)別
- 異常處理:
流程執(zhí)行失敗時(shí)自動(dòng)回滾,歷史表記錄失敗事件
3. 性能優(yōu)化點(diǎn)
// 優(yōu)化查詢性能(添加索引)
@PostConstruct
public void createIndex() {
ManagementService managementService = processEngine.getManagementService();
managementService.createIndex("ACT_IDX_TASK_ASSIGNEE", "ACT_RU_TASK", "ASSIGNEE_");
} 七、生產(chǎn)環(huán)境最佳實(shí)踐
1. 流程版本管理
// 部署新版本流程(保留歷史版本)
RepositoryService repositoryService = processEngine.getRepositoryService();
repositoryService.createDeployment()
.name("請(qǐng)假流程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)控與審計(jì)
// 查詢流程執(zhí)行歷史
HistoryService historyService = processEngine.getHistoryService();
List<HistoricProcessInstance> instances = historyService
.createHistoricProcessInstanceQuery()
.processInstanceBusinessKey("process_123")
.list(); 4. 安全加固
- 權(quán)限控制:
通過 Spring Security 限制 API 訪問,流程變量加密存儲(chǔ)
- 防 SQL 注入:
所有用戶輸入?yún)?shù)使用 MyBatis 的#{}占位符,避免拼接 SQL
八、總結(jié):重新定義流程開發(fā)范式
通過 Spring Boot 與 Flowable 的深度集成,我們實(shí)現(xiàn)了:
- 可視化流程建模:
業(yè)務(wù)人員可獨(dú)立設(shè)計(jì)審批流程,減少技術(shù)依賴
- 低代碼開發(fā):
核心業(yè)務(wù)邏輯與流程引擎解耦,代碼量減少 60% 以上
- 全生命周期管理:
從流程啟動(dòng)到歷史追溯,提供完整的審計(jì)能力
在數(shù)字化轉(zhuǎn)型的今天,工作流引擎不再是 “奢侈品”。Flowable 與 Spring Boot 的組合,讓中小企業(yè)也能快速搭建專業(yè)級(jí)審批系統(tǒng)。掌握這套技術(shù)棧,不僅能提升開發(fā)效率,更能讓你在企業(yè)架構(gòu)設(shè)計(jì)中占據(jù)先機(jī) —— 畢竟,清晰的流程,才是高效協(xié)作的基石
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java虛擬機(jī)執(zhí)行引擎知識(shí)總結(jié)
這篇文章主要介紹了有關(guān)Java虛擬機(jī)執(zhí)行引擎的知識(shí),文中實(shí)例簡(jiǎn)單易懂,方便大家更好的學(xué)習(xí),有興趣的朋友可以了解下2020-06-06
最新SpringCloud?Stream消息驅(qū)動(dòng)講解
SpringCloud Stream 是一個(gè)構(gòu)建消息驅(qū)動(dòng)微服務(wù)的框架,通過 SpringCloud Stream 連接消息中間件,以實(shí)現(xiàn)消息事件驅(qū)動(dòng),這篇文章主要介紹了SpringCloud?Stream消息驅(qū)動(dòng),需要的朋友可以參考下2022-11-11
Java基于SpringBoot和tk.mybatis實(shí)現(xiàn)事務(wù)讀寫分離代碼實(shí)例
這篇文章主要介紹了Java基于SpringBoot和tk.mybatis實(shí)現(xiàn)事務(wù)讀寫分離代碼實(shí)例,讀寫分離,基本的原理是讓主數(shù)據(jù)庫(kù)處理事務(wù)性增、改、刪操作,而從數(shù)據(jù)庫(kù)處理SELECT查詢操作,數(shù)據(jù)庫(kù)復(fù)制被用來(lái)把事務(wù)性操作導(dǎo)致的變更同步到集群中的從數(shù)據(jù)庫(kù),需要的朋友可以參考下2023-10-10
SpringAop中AspectJ框架的切入點(diǎn)表達(dá)式
這篇文章主要介紹了SpringAop中AspectJ框架的切入點(diǎn)表達(dá)式,AspectJ是一個(gè)基于Java語(yǔ)言的AOP框架,Spring2.0以后新增了對(duì)AspectJ切點(diǎn)表達(dá)式支持,@AspectJ 是AspectJ1.5新增功能,通過JDK5注解技術(shù),允許直接在Bean類中定義切面,需要的朋友可以參考下2023-08-08
Springboot整合Mybatispuls的實(shí)例詳解
這篇文章主要介紹了Springboot整合Mybatispuls的相關(guān)資料,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11
Spring Security如何使用URL地址進(jìn)行權(quán)限控制
這篇文章主要介紹了Spring Security如何使用URL地址進(jìn)行權(quán)限控制,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12
springboot+thymeleaf+shiro標(biāo)簽的實(shí)例
這篇文章主要介紹了springboot+thymeleaf+shiro標(biāo)簽的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01

