很多开发者在第一次接触Flowable时,都会遇到一个困惑:明明可以直接使用Flowable提供的独立UI应用,为什么还要费劲把它集成到SpringBoot项目中?这个问题我也曾经纠结过,直到在实际项目中踩过几次坑才真正明白其中的价值。
想象一下这样的场景:你的团队正在开发一个OA系统,需要实现请假审批、报销审批等业务流程。如果直接使用独立的Flowable UI,用户需要在两个完全不同的系统间来回切换,体验非常割裂。而集成后的方案,可以让流程设计、任务审批等功能无缝融入现有系统,用户甚至感觉不到在使用两个不同的产品。
从技术角度看,集成Flowable UI到SpringBoot项目主要带来三个明显优势:
我去年负责的一个电商订单履约系统就采用了集成方案。当客服人员处理退换货申请时,所有流程操作都在同一个管理后台完成,不需要跳转到其他系统,大大提升了工作效率。这种无缝体验是独立部署方案难以实现的。
这个方案的核心思路是让自己的SpringBoot项目继承flowable-ui-parent。具体操作上,需要修改pom.xml中的parent配置:
xml复制<parent>
<groupId>org.flowable</groupId>
<artifactId>flowable-ui-parent</artifactId>
<version>6.6.0</version>
</parent>
这种方式的优势在于配置简单,几乎可以原封不动地移植Flowable UI的所有依赖。但我在实际使用中发现几个潜在问题:
一个典型的踩坑经历是:项目需要引入Spring Security 5.7,但flowable-ui-parent强制使用了5.6版本,导致安全配置无法生效。最终花了整整两天时间才解决这个版本冲突问题。
第二种方案更符合常规SpringBoot项目的做法,保持原有的parent配置,直接引入需要的Flowable模块:
xml复制<dependency>
<groupId>org.flowable</groupId>
<artifactId>flowable-spring-boot-starter-ui-task</artifactId>
<version>6.6.0</version>
</dependency>
<!-- 其他需要的模块 -->
这种方案的主要优点包括:
不过它也有自己的复杂度,需要手动处理一些配置项。比如必须在application.properties中添加:
properties复制spring.main.allow-bean-definition-overriding=true
这个配置允许Bean定义覆盖,是解决Flowable内部Bean与项目已有Bean冲突的关键。我在三个不同项目中实践过这个方案,发现对于已有一定规模的项目,这种显式声明依赖的方式长期来看更易维护。
无论选择哪种方案,都需要先准备好基础环境。这里以MySQL数据库为例,需要提前创建好数据库并配置连接信息:
properties复制spring.datasource.url=jdbc:mysql://localhost:3306/flowable_db
spring.datasource.username=root
spring.datasource.password=yourpassword
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
特别提醒:Flowable对数据库字符集有严格要求,建库时务必使用utf8mb4字符集:
sql复制CREATE DATABASE flowable_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
我曾经因为忽略这点导致流程定义中的中文全部变成问号,不得不重新初始化数据库。
Flowable UI依赖两个重要的配置文件:
需要特别注意几个关键配置项:
properties复制# 在flowable-default.properties中
flowable.idm.app.admin.user-id=admin
flowable.idm.app.admin.password=test
flowable.idm.app.admin.first-name=Admin
flowable.idm.app.admin.last-name=Admin
这些配置定义了默认管理员账号,建议在生产环境中修改默认密码。有一次我们测试环境的Flowable UI被外部扫描到,就是因为使用了默认密码导致未授权访问。
采用第二种方案时,包结构处理是个关键点。不需要像第一种方案那样严格遵循Flowable的包结构,但需要正确处理组件扫描:
java复制@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
所有Flowable的UI类可以直接放在项目的主包下,不需要额外配置@ComponentScan。这种灵活性是第二种方案的最大优势。
成功启动项目后,可以通过以下URL访问各个功能模块:
第一次使用时,建议先用默认管理员账号(admin/test)登录,立即修改密码并创建专属账号。
在Modeler模块中,可以直观地设计业务流程。以简单的请假流程为例:
这个过程我第一次操作时花了半小时,熟悉后其实5分钟就能完成。发布后的流程会自动出现在Task模块中,业务用户就可以开始提交流程实例了。
Admin模块提供了丰富的监控功能,可以查看:
对于生产环境,建议定期检查ACT_RU_TASK表的大小。我曾经遇到过一个流程设计错误导致该表积累了几十万条记录,最终不得不手动清理。
大多数情况下,我们希望复用项目的安全体系。可以通过实现Flowable的IdmIdentityService接口来集成自定义认证:
java复制@Service
public class CustomIdmService implements IdmIdentityService {
@Override
public User authenticate(String username, String password) {
// 调用项目现有的认证逻辑
}
}
这样Flowable UI就会使用项目统一的用户体系,避免维护两套账号系统。
对于高并发场景,建议调整数据库连接池参数:
properties复制spring.datasource.hikari.maximum-pool-size=20
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.idle-timeout=30000
特别是在流程实例数量较多时,默认的连接池配置可能成为性能瓶颈。
Flowable大量使用缓存提升性能,可以通过以下配置调整缓存行为:
properties复制flowable.process.cache.enable=true
flowable.process.cache.max-size=1024
flowable.process.cache.expire-time=3600
对于内存有限的部署环境,适当减小缓存大小可以避免内存溢出。我曾经将max-size从默认的2048降到512,内存使用量减少了40%,而性能只下降了约15%。
如果集成后访问UI页面出现404,通常有三个可能原因:
启动时报错提示表不存在,通常是因为:
当系统运行缓慢时,可以关注:
有个实际案例:一个流程定义包含50个连续的用户任务,导致任务表急剧膨胀。后来通过优化流程设计,将串行任务改为并行网关,性能提升了20倍。