> 技术文档 > SpringBoot 集成 Flowable 实现工作流终极指南_springboot flowable

SpringBoot 集成 Flowable 实现工作流终极指南_springboot flowable


一、引言:当业务流程遇见 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 项目

                        org.flowable          flowable-spring-boot-starter-process          6.8.0                            mysql          mysql-connector-java                            org.springframework.boot          spring-boot-starter-web          

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. 设计请假审批流程

节点说明

    1. 开始事件(Start Event)

    2. 用户任务(User Task):部门经理审批

    3. 排他网关(Exclusive Gateway):根据审批结果分支

    4. 结束事件(End Event)

2. 导出流程文件

将设计好的流程保存为 leave-process.bpmn20.xml,放置在 src/main/resources/processes/ 目录下,核心定义如下:

                                  manager                                                

五、核心代码实现:从引擎集成到业务交互

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 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 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. 引擎初始化流程

  1. Spring Boot 自动配置:

    FlowableAutoConfiguration 注册核心 Bean(ProcessEngine、RuntimeService 等)

  2. 数据库初始化:

    database-schema-update 自动创建 52 张表,支持四种策略(false/null/true/create-drop)

  3. 流程定义部署:

    启动时扫描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 instances = historyService      .createHistoricProcessInstanceQuery()      .processInstanceBusinessKey(\"process_123\")      .list();  

4. 安全加固

  • 权限控制:

    通过 Spring Security 限制 API 访问,流程变量加密存储

  • 防 SQL 注入:

    所有用户输入参数使用 MyBatis 的#{}占位符,避免拼接 SQL

八、总结:重新定义流程开发范式

通过 Spring Boot 与 Flowable 的深度集成,我们实现了:

  1. 可视化流程建模:

    业务人员可独立设计审批流程,减少技术依赖

  2. 低代码开发:

    核心业务逻辑与流程引擎解耦,代码量减少 60% 以上

  3. 全生命周期管理:

    从流程启动到历史追溯,提供完整的审计能力

在数字化转型的今天,工作流引擎不再是 “奢侈品”。Flowable 与 Spring Boot 的组合,让中小企业也能快速搭建专业级审批系统。掌握这套技术栈,不仅能提升开发效率,更能让你在企业架构设计中占据先机 —— 毕竟,清晰的流程,才是高效协作的基石。