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