3. 环境搭建与初始化:Spring Boot 集成 Flowable 引擎,数据库初始化配置

说实话,很多同学学流程引擎,上来就卡在环境搭建这一步。不是依赖冲突,就是数据库表起不来。我早期带团队的时候,光帮人排查集成问题就花了不少时间。今天咱们就把这一步走稳,把坑提前填上。

3.1 为什么选 Spring Boot + Flowable?

你想想看,现在做企业级应用,谁还不用个 Spring Boot?Flowable 作为轻量级流程引擎,跟 Spring Boot 的契合度非常高。我个人习惯是把 Flowable 当作一个“流程中间件”嵌入到业务系统里,而不是单独部署一套流程服务器。

核心优势:

  • Flowable 6.x+ 原生支持 Spring Boot 自动配置
  • 流程定义、实例、任务全部存在业务库中,方便统一备份
  • 不需要额外部署流程服务,减少运维成本

3.2 依赖引入与版本选择

这里有个坑,我先说。Flowable 的版本跟 Spring Boot 版本有对应关系。我曾经见过有人把 Flowable 6.6 配到 Spring Boot 3.0 上,结果启动直接报错。嗯,版本不对,啥都白费。

我建议你直接用这套组合:

组件 推荐版本 说明
Spring Boot 2.7.x 稳定,社区支持好
Flowable 6.7.2 与 2.7.x 完美兼容
MySQL 8.0+ 生产环境推荐
MyBatis-Plus 3.5.x 可选,用于业务表操作

在 pom.xml 里,核心依赖就这几行:

<!-- Flowable Spring Boot Starter -->
<dependency>
    <groupId>org.flowable</groupId>
    <artifactId>flowable-spring-boot-starter</artifactId>
    <version>6.7.2</version>
</dependency>

<!-- 数据库驱动 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

<!-- 连接池(推荐 HikariCP,Spring Boot 默认) -->
<dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId>
</dependency>

小提示: 别一股脑把 flowable-spring-boot-starter-all 加进来。那个包会引入所有 Flowable 模块(包括不常用的 DMN、CMN)。用 starter 就够了,按需再加扩展模块。

3.3 数据库初始化配置

Flowable 启动时会自动检查数据库里有没有 ACT_ 开头的表。如果没有,它会根据配置自动建表。这个机制很方便,但第一次用的时候容易踩坑。

在 application.yml 里,核心配置如下:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/flowable_demo?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true
    username: root
    password: your_password
    driver-class-name: com.mysql.cj.jdbc.Driver
    hikari:
      maximum-pool-size: 20
      minimum-idle: 5

flowable:
  # 数据库策略:true 表示启动时自动建表/升级
  database-schema-update: true
  # 关闭 Flowable 自带的 REST API(我们不用)
  rest-api-enabled: false
  # 异步执行器(生产环境建议开启)
  async-executor-activate: true

这里有个关键参数 nullCatalogMeansCurrent=true。为什么要加这个?

MySQL 8.0 之后,驱动行为变了。如果不加这个参数,Flowable 在检查表是否存在时会扫描所有库,导致误判。我遇到过好几次,明明表已经建了,Flowable 还认为没有,又去重建,结果报错。加上这个参数,它就只检查当前库。

3.4 启动验证:看看表都建了没

配置写好了,启动项目。如果一切正常,控制台会看到类似这样的日志:

2024-01-15 10:23:45.123  INFO 12345 --- [main] o.f.spring.boot.FlowableServletAutoConfiguration : 
Flowable Engine started. Tables checked: 28

然后去数据库里看一眼,应该能看到这些表:

表前缀 用途 核心表举例
ACT_RE_* 流程定义、模型等静态资源 ACT_RE_PROCDEF, ACT_RE_DEPLOYMENT
ACT_RU_* 运行时数据(流程实例、任务、变量) ACT_RU_EXECUTION, ACT_RU_TASK
ACT_HI_* 历史数据(已完成的流程、任务) ACT_HI_PROCINST, ACT_HI_TASKINST
ACT_GE_* 通用数据(如字节数组、属性) ACT_GE_BYTEARRAY, ACT_GE_PROPERTY

一共 28 张表(不同版本略有差异)。如果你看到的是 0 张,那说明配置没生效。检查一下 database-schema-update 是不是被覆盖了。

注意: 生产环境不要用 database-schema-update: true。这个配置在启动时会检查表结构并自动执行 DDL,有锁表风险。生产环境应该用脚本手动执行建表,或者用 Flyway/Liquibase 管理。

3.5 核心流程引擎 API 的初始化

表建好了,引擎也启动了。接下来我们看看怎么拿到 Flowable 的核心 API。Spring Boot 自动配置会帮我们注入这些 Bean:

@Service
public class FlowableService {

    // 流程引擎入口
    @Autowired
    private ProcessEngine processEngine;

    // 运行时服务(启动流程、操作任务)
    @Autowired
    private RuntimeService runtimeService;

    // 任务服务(查询、完成、认领任务)
    @Autowired
    private TaskService taskService;

    // 仓库服务(部署流程定义)
    @Autowired
    private RepositoryService repositoryService;

    // 历史服务(查询已完成的流程)
    @Autowired
    private HistoryService historyService;

    // 身份服务(用户、组管理)
    @Autowired
    private IdentityService identityService;
}

这些服务就是咱们后面写审批流逻辑的“工具箱”。说白了,流程引擎就是靠这几个 Service 来驱动的。

3.6 快速验证:部署一条最简单的流程

为了确认环境真的通了,我习惯写一个简单的测试。部署一条只有一个“开始→结束”的流程定义:

@SpringBootTest
class FlowableInitTest {

    @Autowired
    private RepositoryService repositoryService;

    @Autowired
    private RuntimeService runtimeService;

    @Test
    void testDeployAndStart() {
        // 1. 部署流程定义(BPMN 文件放在 resources/processes/ 下)
        Deployment deployment = repositoryService.createDeployment()
                .addClasspathResource("processes/simple-approval.bpmn20.xml")
                .name("简单审批流程")
                .deploy();

        System.out.println("部署ID: " + deployment.getId());

        // 2. 启动流程实例
        ProcessInstance processInstance = runtimeService
                .startProcessInstanceByKey("simpleApproval");

        System.out.println("流程实例ID: " + processInstance.getId());
        System.out.println("环境搭建成功!");
    }
}

跑一下这个测试。如果控制台打印出部署ID和流程实例ID,恭喜你,环境搭好了。

避坑指南: 我曾经遇到过 BPMN 文件放在 resources 下但没被扫描到的情况。检查一下 flowable.process-definition-location-prefix 配置,默认是 classpath*:/processes/。如果你改了路径,记得同步更新。

3.7 整体架构图

下面这张图,是我自己画的环境搭建整体架构。你可以对照着检查自己的配置:

Spring Boot + Flowable 环境搭建架构 Spring Boot 应用 FlowableAutoConfiguration · 自动注入 ProcessEngine · 生命周期管理 Flowable Process Engine RepositoryService · RuntimeService · TaskService · HistoryService · IdentityService databaseSchemaUpdate=true 自动建表 HikariCP 连接池 + MySQL 8.0 nullCatalogMeansCurrent=true 避免表误判 ACT_RE_* ACT_RU_* ACT_HI_* 共 28 张表 按前缀分类管理

从这张图可以看得很清楚:Spring Boot 启动后,Flowable 自动配置会初始化 ProcessEngine,然后通过数据源连接 MySQL,自动创建 28 张流程表。后面我们所有的流程操作,都是基于这四类表来完成的。

3.8 常见问题排查

最后,我把这些年遇到的环境搭建问题整理了一下。你如果启动报错,先对照这个表查:

错误现象 原因 解决方案
启动报 Table 'ACT_GE_PROPERTY' doesn't exist 数据库连接串没加 nullCatalogMeansCurrent=true 在 JDBC URL 末尾加上该参数
控制台打印 Tables checked: 0 database-schema-update 被设置为 false 或未生效 检查 yml 配置,确认没有其他地方覆盖
启动报 DataSource 不可用 MySQL 连接超时或密码错误 先单独测一下数据库连接是否正常
部署 BPMN 文件报 资源未找到 文件没放在 resources/processes/ 下 检查路径,或者用路径部署