SpringBoot集成Flowable实现工作流解读

 更新时间:2025年08月12日 09:24:07   作者:Java程序员 拥抱ai  
文章介绍如何通过Flowable与SpringBoot结合搭建企业审批系统,涵盖流程设计、引擎集成、业务交互及全生命周期管理,实现可视化建模、低代码开发,助力中小企业高效协作与数字化转型

一、引言:当业务流程遇见 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 的组合,让中小企业也能快速搭建专业级审批系统。掌握这套技术栈,不仅能提升开发效率,更能让你在企业架构设计中占据先机 —— 毕竟,清晰的流程,才是高效协作的基石

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java虚拟机执行引擎知识总结

    Java虚拟机执行引擎知识总结

    这篇文章主要介绍了有关Java虚拟机执行引擎的知识,文中实例简单易懂,方便大家更好的学习,有兴趣的朋友可以了解下
    2020-06-06
  • 最新SpringCloud Stream消息驱动讲解

    最新SpringCloud Stream消息驱动讲解

    SpringCloud Stream 是一个构建消息驱动微服务的框架,通过 SpringCloud Stream 连接消息中间件,以实现消息事件驱动,这篇文章主要介绍了SpringCloud Stream消息驱动,需要的朋友可以参考下
    2022-11-11
  • Java基于SpringBoot和tk.mybatis实现事务读写分离代码实例

    Java基于SpringBoot和tk.mybatis实现事务读写分离代码实例

    这篇文章主要介绍了Java基于SpringBoot和tk.mybatis实现事务读写分离代码实例,读写分离,基本的原理是让主数据库处理事务性增、改、删操作,而从数据库处理SELECT查询操作,数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库,需要的朋友可以参考下
    2023-10-10
  • Java中indexOf函数示例详解

    Java中indexOf函数示例详解

    Java String 类的 indexOf() 方法返回指定字符串中指定字符或字符串第一次出现的位置,这篇文章主要介绍了Java中indexOf函数详解,需要的朋友可以参考下
    2024-01-01
  • SpringAop中AspectJ框架的切入点表达式

    SpringAop中AspectJ框架的切入点表达式

    这篇文章主要介绍了SpringAop中AspectJ框架的切入点表达式,AspectJ是一个基于Java语言的AOP框架,Spring2.0以后新增了对AspectJ切点表达式支持,@AspectJ 是AspectJ1.5新增功能,通过JDK5注解技术,允许直接在Bean类中定义切面,需要的朋友可以参考下
    2023-08-08
  • Eclipse在线安装hibernate插件

    Eclipse在线安装hibernate插件

    这篇文章主要介绍了Eclipse在线安装hibernate插件,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-04-04
  • Springboot整合Mybatispuls的实例详解

    Springboot整合Mybatispuls的实例详解

    这篇文章主要介绍了Springboot整合Mybatispuls的相关资料,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • Java线程休眠的5种方法

    Java线程休眠的5种方法

    这篇文章主要介绍了Java线程休眠的5种方法,分别是Thread.sleep、TimeUnit、wait、Condition、LockSupport,下面文章将对这五种方法进行详细讲解,需要的小伙伴可以参考一下
    2022-05-05
  • Spring Security如何使用URL地址进行权限控制

    Spring Security如何使用URL地址进行权限控制

    这篇文章主要介绍了Spring Security如何使用URL地址进行权限控制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • springboot+thymeleaf+shiro标签的实例

    springboot+thymeleaf+shiro标签的实例

    这篇文章主要介绍了springboot+thymeleaf+shiro标签的实例,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01

最新评论