目录
- 一、引言:当业务流程遇见 Flowable
- 二、Flowable 核心概念:重新定义流程管理
- 1. 三大核心组件
- 2. 核心优势
- 三、实战准备:搭建开发环境
- 1. 创建 Spring Boot 项目
- 2. 配置数据库与引擎
- 四、流程建模:用 Flowable Designer 画审批蓝图
- 1. 设计请假审批流程
- 2. 导出流程文件
- 五、核心代码实现:从引擎集成到业务交互
- 1. 流程服务层(核心逻辑)
- 2. 控制器层(REST 接口)
- 3. 数据库表说明
- 六、深度解析:Flowable 架构与 Spring Boot 的化学反应
- 1. 引擎初始化流程
- 2. 事务管理机制
- 3. 性能优化点
- 七、生产环境php最佳实践
- 1. 流程版本管理
- 2. 表单集成方案
- 3. 监控与审计
- 4. 安全加固
- 八、总结:重新定义流程开发范式
一、引言:当业务流程遇见 Flowable
在企业级应用中,审批流程是绕不开的核心需求:从请假申请到合同审批,从报销流程到项目立项,标准化的工作流能显著提升协作效率。
传统硬编码实现审批逻辑,往往导致代码臃肿、维护困难,而 Flowable 作为轻量级工作流引擎,与 Spring Boot 的结合堪称 “天作之合”。
本文将从 0 到 1 搭建一个完整的审批系统,涵盖流程设计、引擎集成、业务交互全流程,附可运行的生产级源码。
二、Flowable 核心概念:重新定义流程管理
1. 三大核心组件
- 流程引擎(Procjsess Engine):
Flowable 的心脏,负责解析流程定义、管理流程实例、调度任务
- 流程定义(Process Definition):
可视化的流程蓝图,通过 BPMN 2.0 标准定义节点(开始 / 结束事件、用户任务、网关等)
- 任务(Task):
流程执行过程中产生的待办事项,包含办理人、截止时间、表单数据等属性
2. 核心优势
- 轻量化:
独立于 Spring 的引擎实现,最小依赖仅 2MB
- 兼容性:
完全兼容 Activiti 5/6 流程文件,支持多数据库(mysql/PostgreSQL/oracle)
- 扩展性:
提供 Java API、REST 接口、表单引擎、决策表等扩展模块
三、实战准备:搭建开发环境
1. 创建http://www.devze.com 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 aShAePpjuflowable: 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 的组合,让中小企业也能快速搭建专业级审批系统。掌握这套技术栈,不仅能提升开发效率,更能让你在企业架构设计中占据先机 —— 毕竟,清晰的流程,才是高效协作的基石
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。
精彩评论