资讯动态

Flowable 6.8.1 + Spring Boot 2.6.13 + MySQL 8 工作流环境整合实战

发布时间:2026/9/2 10:31:35 来源:尧图企业网站定制
简介这是一份面向Java企业级开发者与Flowable工作流学习者的完整集成资源基于Spring Boot 2.6.13、MySQL 8与Flowable 6.8.1构建旨在解决工作流引擎与主流框架整合的环境搭建痛点。压缩包内共29个文件涵盖pom.xml项目配置、7个Java源码、5个class编译产物、多个xml与yml配置以及mysql-installer-community-8.0.41.0.msi安装程序整体大小约382.9MB。自带的MySQL 8安装包可省去单独安装数据库的步骤同时源码与编译产物并存便于对照阅读流程定义与业务代码。通过这份资源可以快速完成项目依赖导入与数据库连接专注于核心业务流程的开发与调试减少环境配置时间。资源适合需要落地流程引擎、了解BPMN建模、或准备在Spring Boot项目中接入Flowable的开发者参考已有105人学习下载具备一定实践参考价值。 搞工作流开发的朋友尤其是想从 Activiti 转过来或者第一次碰 Flowable 的应该都经历过那种“还没开始写流程先被环境折腾到崩溃”的阶段。Spring Boot 版本高了不行低了 Flowable 不认MySQL 装了半天最后发现密码策略、时区、驱动类名全是坑。我自己在本地搭 Flowable 开发环境的时候光是 MySQL 就装了三遍后来干脆换了个思路把整套环境做成一个自带 MySQL 8 安装程序的工程用 Spring Boot 2.6.13 做底座Flowable 6.8.1 做引擎解压之后跑一个脚本数据库和 Flowable 一起起来直接就能写流程。这篇文章就是这套整合方案的完整复盘包括版本选型的逻辑、工程结构的设计、关键配置的解读以及我实测踩过的坑准备接 Flowable 进项目的朋友可以参考。1. 为什么要选这套组合版本兼容的真相1.1 版本搭配的逻辑先说结论我选的组合是 Spring Boot 2.6.13 MySQL 8 Flowable 6.8.1这是一个经过实测非常稳的三角组合。很多人习惯直接去 Maven 仓库拉最新版本结果发现 Spring Boot 3.x 跟 Flowable 6.8.1 根本跑不起来然后开始怀疑人生。其实版本选型的核心原则不是“越新越好”而是“官方适配 生态成熟”。我个人的经验是Spring Boot 2.6.13 是 2.6 系列的最后一个维护版本它把 2.6 系列累积的安全补丁和 bug 修复全都包含进去了同时整体 API 又保持了 Spring Boot 2.x 的风格不会像 3.x 那样引入 Jakarta EE 9 的大规模命名空间变更。Flowable 6.8.1 对 Spring Boot 2.6 的支持是官方明确测试过的两者的依赖版本、自动配置逻辑都对得上几乎不需要额外排除冲突。1.2 为什么不用 Spring Boot 3.x这里多说一句Spring Boot 3.x 也是可以跑 Flowable 的但需要用 Flowable 7.x而 Flowable 7 不管在 API 还是配置方式上都有不少调整网上能查到的资料相对少对于一些刚上手工作流的团队来说学习成本会突然翻倍。而 Flowable 6.8.1 是 Flowable 6.x 的晚期版本稳定性、文档、社区问答都非常成熟再加上它跟 Activiti 5/6 在 API 设计上很接近很多老 Activiti 开发可以零成本迁移过来。用这套组合就非常合适。Spring Boot 2.6.13 的自动配置已经足够完善Flowable 6.8.1 的 starter 也能无缝接入整套环境的复杂度被控制在一个很舒服的范围内。1.3 为什么选 MySQL 8 而不是 5.7MySQL 8 是当前的主流版本也是 Flowable 官方测试覆盖最充分的数据库之一。相比 5.7MySQL 8 在性能、窗口函数、CTE公共表表达式这些能力上强了很多而且 8.0 的官方 JDBC 驱动mysql-connector-j在连接配置上更规范比如驱动类名是com.mysql.cj.jdbc.Driver跟 5.x 时代的com.mysql.jdbc.Driver已经不一样了。不过 MySQL 8 也带来了两个著名的“劝退点”默认认证插件是caching_sha2_password旧版连接工具和驱动不兼容时区配置更严格连接串里不写serverTimezone会直接报错。内置 MySQL 8 的安装程序就能在环境层面把这些坑一次性填平后续开发只需要关注业务流程本身。2. 自带 MySQL 8 安装程序的工程结构2.1 整体目录设计“自带 MySQL 8 安装程序”这个概念说白了就是把 MySQL 8 的免安装版zip 格式发行版直接放进项目里再用脚本完成初始化、启动、建库这些操作让使用者不需要单独去官网下载安装包也不需要手动配置系统服务。这是我实际用的目录结构flowable-demo/ ├── mysql/ │ ├── mysql-8.0.31-winx64/ # MySQL 8 免安装版 │ ├── init_mysql.bat # MySQL 初始化脚本 │ └── start_mysql.bat # MySQL 启动脚本 ├── src/ │ └── main/ │ ├── java/com/example/flowable/ │ ├── resources/ │ │ ├── application.yml │ │ └── processes/ │ └── ... ├── pom.xml └── start_all.bat # 一键启动脚本最关键的设计点在于把 MySQL 的解压、初始化、启动全部拉平到同一个工程里。使用者拿到项目后不需要关心 MySQL 本身怎么装只需要按顺序点两个脚本整个开发环境就绪。2.2 一键安装脚本init_mysql.bat的核心逻辑是这样的首先检查data目录是否存在如果不存在就执行mysqld --initialize-insecure初始化一个 root 用户无密码的 MySQL 实例。这里用initialize-insecure是为了后续免密登录然后通过 SQL 脚本修改 root 密码同时创建一个专用的业务数据库。echo off cd /d %~dp0 if exist mysql\mysql-8.0.31-winx64\data ( echo [INFO] MySQL data directory already exists. goto start ) echo [INFO] Initializing MySQL data directory... mysql\mysql-8.0.31-winx64\bin\mysqld --initialize-insecure --basedir%cd%\mysql\mysql-8.0.31-winx64 --datadir%cd%\mysql\mysql-8.0.31-winx64\data :start echo [INFO] Starting MySQL server... start MySQL Server mysql\mysql-8.0.31-winx64\bin\mysqld --basedir%cd%\mysql\mysql-8.0.31-winx64 --datadir%cd%\mysql\mysql-8.0.31-winx64\data --port3306 timeout /t 5 /nobreak nul mysql\mysql-8.0.31-winx64\bin\mysql -u root -e ALTER USER rootlocalhost IDENTIFIED BY 123456; CREATE DATABASE IF NOT EXISTS flowable_demo DEFAULT CHARACTER SET utf8mb4;这里有个值得注意的细节我没有去配置 MySQL 的系统环境变量而是每次都通过完整路径调用mysqld。这样做的目的是避免污染开发者的机器环境。如果哪天不需要这个项目了直接删除目录就行不会给系统留下任何残留。2.3 统一启动流程start_all.bat做的事情更简单先调init_mysql.bat确保 MySQL 起来了然后检查 3306 端口是否被占用最后通过 Maven 启动 Spring Boot 应用。echo off cd /d %~dp0 call mysql\init_mysql.bat echo [INFO] Waiting for MySQL to be ready... timeout /t 5 /nobreak nul echo [INFO] Starting Spring Boot Application... mvn spring-boot:run -pl . -am第一次跑这个脚本的时候会自动初始化 MySQL 数据目录然后启动数据库接着启动 Spring Boot。第二次再跑MySQL 数据目录已经存在脚本就直接跳过初始化阶段整体启动时间会快很多。这个从“环境搭建”到“开发编码”的路径非常顺滑尤其适合把工程交给新人。3. 环境准备与依赖配置3.1 数据库初始化与业务库创建我建议在 MySQL 启动后手动确认一下数据库状态执行下面这个命令看有没有建出flowable_demo库mysql -u root -p123456 -e SHOW DATABASES;正常情况下可以看到除了系统自带的information_schema、mysql、performance_schema、sys之外多了一个flowable_demo。这里我特意把字符集指定成utf8mb4因为 Flowable 的表结构里有很多VARCHAR字段如果默认字符集不是 utf8mb4一旦流程变量里存了 emoji 表情保存的时候大概率会报Incorrect string value错误。utf8mb4兼容完整的 Unicode 字符集包括 emoji这是在现代业务系统里的基本要求。如果这一步漏掉了后续流程数据写入时非常容易出问题。3.2 pom.xml 核心依赖项目的 Maven 依赖并不复杂核心就是三个spring-boot-starter-web、flowable-spring-boot-starter-process、mysql-connector-j。这里我直接上关键代码parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version2.6.13/version relativePath/ /parent properties java.version1.8/java.version /properties dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdorg.flowable/groupId artifactIdflowable-spring-boot-starter-process/artifactId version6.8.1/version /dependency dependency groupIdmysql/groupId artifactIdmysql-connector-j/artifactId scoperuntime/scope /dependency /dependencies注意mysql-connector-j是不需要写版本号的因为 Spring Boot 2.6.13 的依赖管理已经锁定了 8.0.x 的驱动版本如果手动指定反而可能出现驱动版本跟数据库服务端不匹配的问题。还有一种很常见的错误是在加了flowable-spring-boot-starter-process之后又额外引入flowable-engine这会导致重复加载引擎实例启动时报FlowableException: duplicate engine。这也是我好几次遇到后排查出来的问题。3.3 application.yml 关键配置配置文件是整套整合中最能体现“细节”的地方我的application.yml长这样server: port: 8080 spring: datasource: url: jdbc:mysql://localhost:3306/flowable_demo?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/ShanghaiallowPublicKeyRetrievaltrue username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver flowable: database-schema-update: true async-executor-activate: false history-level: full这里面最关键的是数据库连接串后面跟的那一串参数每一个都不是多余的serverTimezoneAsia/Shanghai是必填项MySQL 8 的驱动对时区非常敏感不写会直接报The server time zone value ... is unrecognized。useSSLfalse用于关闭 SSL 握手本地开发不需要加密连接加上它可以让连接响应更快。allowPublicKeyRetrievaltrue解决的是 MySQL 8 默认认证插件caching_sha2_password在非 SSL 连接下无法获取公钥的问题不配的话连接会直接失败。flowable.database-schema-updatetrue表示允许 Flowable 在启动时自动检查并更新数据库表结构首次运行的时候会自动创建全部数据表这个配置在开发阶段非常方便基本不需要手动执行 SQL 脚本。async-executor-activatefalse是关闭 Flowable 的异步执行器避免流程引擎启动后自动跑一些异步定时任务在本地调试的时候保持环境安静。4. Flowable 引擎启动与自动建表4.1 首次启动观察配置好之后直接启动 Spring Boot 应用。日志中出现的核心信息包括 Flowable 的启动 banner、引擎创建成功提示以及数据库表结构自动更新的日志。第一次启动会自动创建大约 70 张表覆盖流程定义、流程实例、任务、身份、历史数据等模块。这不是 Flowable “魔法般”自动生成的而是引擎内置了建表 SQL 脚本根据数据库类型自动选择对应方言的脚本执行。database-schema-updatetrue表示每次启动都会对比表结构如果缺少表就创建如果列有差异就尝试更新。4.2 Flowable 建表机制解析Flowable 的表命名非常有规律基本可以分为几个模块表前缀所属模块主要作用ACT_RE_*Repository流程定义、流程模型等静态资源ACT_RU_*Runtime运行中的流程实例、任务、变量ACT_ID_*Identity用户、组等身份信息ACT_HI_*History历史流程实例、历史任务等ACT_GE_*General通用数据比如二进制资源ACT_EVT_*Event事件订阅相关运行中的流程数据ACT_RU_*在流程结束后会被清理而历史数据ACT_HI_*则会一直保留这是 Flowable 的核心设计思想运行时表保持精简历史数据完整保留方便流程轨迹回放和审计。4.3 常用数据表速查对于刚接触 Flowable 的开发者我建议先认识这六张表它们覆盖了 90% 的日常调试场景ACT_RE_PROCDEF流程定义表每个部署的 BPMN 文件在这里对应一条记录KEY_字段是流程的标识。ACT_RU_EXECUTION流程实例执行表启动流程后会在这里插入记录。ACT_RU_TASK待办任务表用户需要处理的任务都在这张表里。ACT_RU_VARIABLE流程变量表存储流程中传递的变量值。ACT_HI_PROCINST历史流程实例表流程结束后依旧能查到完整信息。ACT_HI_TASKINST历史任务表所有已办、待办任务在这里都可以回溯。5. 从配置到实战跑通一个完整流程5.1 编写 BPMN 文件环境起来之后干点正事。以最常见的“请假审批”为例我在src/main/resources/processes/目录下放了一个leave.bpmn20.xml文件。Flowable 启动时会自动扫描这个目录下的 BPMN 文件并完成部署所以只要把文件丢进processes目录重启应用这个流程就自动注册到引擎里了。下面这个是非常精简的 BPMN 定义?xml version1.0 encodingUTF-8? definitions xmlnshttp://www.omg.org/spec/BPMN/20100524/MODEL xmlns:flowablehttp://flowable.org/bpmn targetNamespacehttp://www.flowable.org/processdef process idleaveProcess nameLeave Approval isExecutabletrue startEvent idstartEvent nameStart/ sequenceFlow idflow1 sourceRefstartEvent targetRefapproveTask/ userTask idapproveTask nameManager Approval flowable:assignee${approver}/ sequenceFlow idflow2 sourceRefapproveTask targetRefendEvent/ endEvent idendEvent nameEnd/ /process /definitions这个流程的逻辑非常简单发起一个请假申请然后由approver这个流程变量指定的审批人处理通过后结束流程。flowable:assignee${approver}表示任务分配人是动态的由发起流程实例时传入的approver变量决定。5.2 部署与发起流程Flowable 的对外操作主要靠三个 ServiceRepositoryService负责管理流程定义RuntimeService负责启动流程实例TaskService负责处理任务。我写一个简单的 Controller 来演示完整链路RestController public class LeaveController { Autowired private RepositoryService repositoryService; Autowired private RuntimeService runtimeService; Autowired private TaskService taskService; PostMapping(/deploy) public String deploy() { repositoryService.createDeployment() .addClasspathResource(processes/leave.bpmn20.xml) .name(请假流程) .deploy(); return deployed; } PostMapping(/start) public String start(RequestParam String approver) { MapString, Object variables new HashMap(); variables.put(approver, approver); ProcessInstance instance runtimeService .startProcessInstanceByKey(leaveProcess, variables); return instance.getId(); } GetMapping(/tasks) public ListTask tasks(RequestParam String assignee) { return taskService.createTaskQuery() .taskAssignee(assignee) .list(); } }部署接口通过addClasspathResource加载 BPMN 文件并部署到引擎启动接口调用startProcessInstanceByKey传入流程定义 ID 和流程变量Flowable 就会创建一个流程实例并自动生成一个待办任务任务分配人是approver变量的值。5.3 处理待办任务当审批人查看待办任务后执行审批操作PostMapping(/complete) public String complete(RequestParam String taskId) { taskService.complete(taskId); return completed; }taskService.complete(taskId)表示当前任务完成流程自动流转到下一个节点。如果之后有多个审批节点这个逻辑是一样的每个节点完成之后Flowable 会根据 BPMN 定义找人建下一个任务全链路可以这样一路推下去。到这里这个流程还没有加任何业务流程代码但已经完成了从流程部署、发起、查询待办到完成任务的标准闭环。对新手来说先跑通这条链路再逐步往 BPMN 里加网关、会签、子流程学习曲线会平滑很多。6. 常见问题与排查技巧实录6.1 MySQL 8 连接类问题排查最多的一类问题是 MySQL 8 特有的。第一个是连接报Public Key Retrieval is not allowed这个就是连接串没加allowPublicKeyRetrievaltrue。第二个是The server time zone value报错需要确认serverTimezone参数写对了。第三个是认证失败Access denied for user rootlocalhost先确认初始化脚本有没有正确执行可以用命令行手动登录验证一次。6.2 Flowable 建表与启动类问题如果启动过程中没有自动建表需要检查flowable.database-schema-update是否设置成了true。另一个常见问题是在启动日志里看到Table ACT_GE_PROPERTY doesnt exist但数据源连接的数据库却不是预期的库通常是因为连接串里database名写错了Flowable 在空库上建表和现有表结构不匹配就会有这类报错。6.3 依赖与运行期冲突Spring Boot 项目里经常出现NoClassDefFoundError: javax/xml/bind/JAXBException这类错误这其实是 JDK 版本引起的。JDK 9 以后默认不包含 JAXB 模块而 Flowable 6.8.1 依赖了它。Java 8 环境下通常没问题如果用 JDK 11就需要额外引入javax.xml.bind:jaxb-api来补上。这也是为什么我的 pom 里特意把java.version锁定为 1.8省去很多不必要的兼容问题。另一个容易被忽略的问题是 Flowable 自带的 MyBatis 版本跟项目里其他 MyBatis 相关依赖冲突通常表现为启动时出现Invalid bound statement或MapperStatement相关异常。排查思路是执行mvn dependency:tree看flowable-spring-boot-starter-process是否引入了多个版本的 MyBatis然后通过排除依赖统一版本。还有一个实战心得如果本地 3306 端口被已有的 MySQL 实例占了start_all.bat里的初始化脚本是不会管这些的需要你先把旧实例停掉或者把内置 MySQL 的端口改到 3307同时把application.yml里的连接串也改成 3307。这个细节最容易让新手摸不着头脑因为脚本日志里明明显示 MySQL 启动了但 Spring Boot 却连不上。把 Flowable 6.8.1、Spring Boot 2.6.13 和内置的 MySQL 8 组合到一起之后整个工作流开发环境基本就是“一次配置永久使用”的状态。我在实际使用中最直观的感受是团队新成员接入成本被压到了最低——不需要理解 MySQL 怎么装不需要手动跑建表脚本找到start_all.bat点一下环境就起来了。后面当你把流程引擎真正接入业务系统时也建议保留这种“一键拉环境”的思路让每个开发者的本地环境都能快速对齐。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价