一、引言:当业务流程遇见 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 的组合,让中小企业也能快速搭建专业级审批系统。掌握这套技术栈,不仅能提升开发效率,更能让你在企业架构设计中占据先机 —— 毕竟,清晰的流程,才是高效协作的基石
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论