一、引言:当业务流程遇见 Flowable
在企业级应用中,审批流程是绕不开的核心需求:从请假申请到合同审批,从报销流程到项目立项,标准化的工作流能显著提升协作效率。传统硬编码实现审批逻辑,往往导致代码臃肿、维护困难,而 Flowable 作为轻量级工作流引擎,与 Spring Boot 的结合堪称 “天作之合”。本文将从 0 到 1 搭建一个完整的审批系统,涵盖流程设计、引擎集成、业务交互全流程,附可运行的生产级源码。
二、Flowable 核心概念:重新定义流程管理
1. 三大核心组件
- 流程引擎(Process Engine):
Flowable 的心脏,负责解析流程定义、管理流程实例、调度任务
- 流程定义(Process Definition):
可视化的流程蓝图,通过 BPMN 2.0 标准定义节点(开始 / 结束事件、用户任务、网关等)
- 任务(Task):
流程执行过程中产生的待办事项,包含办理人、截止时间、表单数据等属性
2. 核心优势
- 轻量化:
独立于 Spring 的引擎实现,最小依赖仅 2MB
- 兼容性:
完全兼容 Activiti 5/6 流程文件,支持多数据库(MySQL/PostgreSQL/Oracle)
- 扩展性:
提供 Java API、REST 接口、表单引擎、决策表等扩展模块
三、实战准备:搭建开发环境
1. 创建 Spring Boot 项目
<!-- pom.xml 依赖 -->
<dependencies>
<!-- Flowable核心依赖 -->
<dependency>
<groupId>org.flowable</groupId>
<artifactId>flowable-spring-boot-starter-process</artifactId>
<version>6.8.0</version>
</dependency>
<!-- 数据库依赖(以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. 配置数据库与引擎
# 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 # 自动创建/更新数据库表
check-process-definitions: true # 启动时检查流程定义
async-executor-activate: false # 禁用异步执行器(简化开发)
四、流程建模:用 Flowable Designer 画审批蓝图
1. 设计请假审批流程
节点说明
-
-
开始事件(Start Event)
-
用户任务(User Task):部门经理审批
-
排他网关(Exclusive Gateway):根据审批结果分支
-
结束事件(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="部门经理审批">
<extensionElements>
<flowable:assignee>manager</flowable:assignee> <!-- 办理人变量 -->
</extensionElements>
</userTask>
<exclusiveGateway id="approvalGate" name="审批结果" />
<endEvent id="approveEnd" name="审批通过" />
<endEvent id="rejectEnd" name="审批拒绝" />
<!-- 流程连线定义 -->
</process>
</definitions>
五、核心代码实现:从引擎集成到业务交互
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. 发起请假流程
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); // 认领任务
taskService.complete(taskId, Map.of("approved", approved)); // 提交审批结果
}
// 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;
// 发起流程
@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. 数据库表说明
Flowable 自动创建以下核心表(以 MySQL 为例):
表名 |
作用 |
---|---|
ACT_RE_PROCDEF |
流程定义表 |
ACT_RU_INSTANCE |
运行时流程实例表 |
ACT_RU_TASK |
运行时任务表 |
ACT_HI_PROCINST |
历史流程实例表 |
ACT_HI_TASKINST |
历史任务表 |
六、深度解析:Flowable 架构与 Spring Boot 的化学反应
1. 引擎初始化流程
- Spring Boot 自动配置:
FlowableAutoConfiguration
注册核心 Bean(ProcessEngine、RuntimeService 等) - 数据库初始化:
database-schema-update
自动创建 52 张表,支持四种策略(false/null/true/create-drop) - 流程定义部署:
启动时扫描
classpath:/processes/
目录,自动部署 BPMN 文件
2. 事务管理机制
- 与 Spring 事务集成:
流程操作(启动 / 完成任务)自动纳入 Spring 事务
- 隔离级别:
通过
@Transactional
注解控制,默认使用数据库默认隔离级别 - 异常处理:
流程执行失败时自动回滚,历史表记录失败事件
3. 性能优化点
// 优化查询性能(添加索引)
@PostConstruct
public void createIndex() {
ManagementService managementService = processEngine.getManagementService();
managementService.createIndex("ACT_IDX_TASK_ASSIGNEE", "ACT_RU_TASK", "ASSIGNEE_");
}
七、生产环境最佳实践
1. 流程版本管理
// 部署新版本流程(保留历史版本)
RepositoryService repositoryService = processEngine.getRepositoryService();
repositoryService.createDeployment()
.name("请假流程V2.0")
.addClasspathResource("processes/leave-process-v2.bpmn20.xml")
.deploy();
2. 表单集成方案
- 内嵌表单:
在 BPMN 中定义
flowable:formField
,通过TaskService.getTaskFormData()
获取表单元数据 - 外置表单:
使用 Flowable Form 引擎,支持 HTML/CSS/JavaScript 自定义表单
3. 监控与审计
// 查询流程执行历史
HistoryService historyService = processEngine.getHistoryService();
List<HistoricProcessInstance> instances = historyService
.createHistoricProcessInstanceQuery()
.processInstanceBusinessKey("process_123")
.list();
4. 安全加固
- 权限控制:
通过 Spring Security 限制 API 访问,流程变量加密存储
- 防 SQL 注入:
所有用户输入参数使用 MyBatis 的
#{}
占位符,避免拼接 SQL
八、总结:重新定义流程开发范式
通过 Spring Boot 与 Flowable 的深度集成,我们实现了:
- 可视化流程建模:
业务人员可独立设计审批流程,减少技术依赖
- 低代码开发:
核心业务逻辑与流程引擎解耦,代码量减少 60% 以上
- 全生命周期管理:
从流程启动到历史追溯,提供完整的审计能力
在数字化转型的今天,工作流引擎不再是 “奢侈品”。Flowable 与 Spring Boot 的组合,让中小企业也能快速搭建专业级审批系统。掌握这套技术栈,不仅能提升开发效率,更能让你在企业架构设计中占据先机 —— 毕竟,清晰的流程,才是高效协作的基石。