Jeecg-Boot项目集成Activiti工作流,我踩过的那些‘版本兼容’和‘多数据源’的坑(附完整yml配置)
Jeecg-Boot项目集成Activiti工作流实战:版本兼容与多数据源配置全解析
当Jeecg-Boot 2.1.4遇上Activiti 5.22,这场看似标准的集成却暗藏玄机。作为经历过完整集成周期的开发者,我想分享那些官方文档没告诉你的实战细节——特别是当系统已经采用多数据源架构时,工作流引擎的配置会变得尤为棘手。本文将聚焦三个最易出错的环节:依赖冲突的精准排除、多数据源环境下的引擎初始化,以及汉化版Modeler的路径配置陷阱。
1. 依赖冲突:Spring Security的隐形战争
在引入activiti-spring依赖时,大多数开发者会忽略它悄悄带入的Spring Security组件。Jeecg-Boot本身已经集成Shiro作为安全框架,这种隐性依赖会导致运行时出现FilterChain冲突。以下是经过验证的pom.xml配置方案:
<dependency> <groupId>org.activiti</groupId> <artifactId>activiti-spring</artifactId> <version>5.22.0</version> <exclusions> <exclusion> <groupId>org.springframework.security</groupId> <artifactId>spring-security-config</artifactId> </exclusion> <!-- 必须同时排除以下两个相关依赖 --> <exclusion> <groupId>org.springframework.security</groupId> <artifactId>spring-security-web</artifactId> </exclusion> <exclusion> <groupId>org.springframework.security</groupId> <artifactId>spring-security-crypto</artifactId> </exclusion> </exclusions> </dependency>注意:仅排除spring-security-config是不够的,必须同步处理web和crypto模块,否则启动时仍可能抛出
NoSuchBeanDefinitionException
常见问题排查表:
| 异常现象 | 可能原因 | 解决方案 |
|---|---|---|
NoSuchBeanDefinitionException | 未完全排除Security依赖 | 检查所有transitive依赖 |
FilterRegistrationBean冲突 | 重复注册securityFilter | 确认Shiro配置是否生效 |
| 流程定义无法部署 | 事务管理器冲突 | 检查@Transactional注解来源 |
2. 多数据源配置:工作流引擎的独立王国
Jeecg-Boot默认使用Druid连接池,但Activiti需要特殊的数据源初始化方式。关键点在于保持业务数据源与工作流数据源的完全隔离:
spring: datasource: druid: master: url: jdbc:mysql://127.0.0.1:3306/jeecg-boot username: root password: ${DB_PWD} activiti: database-schema-update: true db-identity-used: false # 独立配置工作流数据源(与主数据源同级) datasource: url: jdbc:mysql://127.0.0.1:3306/activiti-db username: activiti password: ${ACTIVITI_DB_PWD} driver-class-name: com.mysql.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource对应的Java配置类需要重写ProcessEngineConfiguration:
@Configuration public class ActivitiConfig { @Bean public SpringProcessEngineConfiguration processEngineConfiguration( @Qualifier("activitiDataSource") DataSource dataSource, PlatformTransactionManager transactionManager) { SpringProcessEngineConfiguration config = new SpringProcessEngineConfiguration(); config.setDataSource(dataSource); config.setTransactionManager(transactionManager); config.setDatabaseSchemaUpdate("true"); config.setDbIdentityUsed(false); // 关键设置:避免与主数据源的事务管理器冲突 config.setTransactionFactory(new SpringTransactionFactory()); return config; } }多数据源环境下常见问题:
- 事务不同步:业务操作与流程操作不在同一个事务中
- 连接泄漏:工作流引擎未正确关闭数据库连接
- 表前缀失效:
databaseTablePrefix配置在多数据源时异常
3. 汉化版Modeler的路径迷宫
从activiti-explorer中提取的汉化资源需要精确放置,否则会出现以下典型错误:
- 设计器界面空白(静态资源404)
- 保存按钮失效(接口路径错误)
- 汉化文字显示为乱码(字符集不匹配)
正确的目录结构应如下:
src/main/resources ├── static │ ├── diagram-viewer # 流程图查看器 │ ├── editor-app # 核心设计器JS │ └── stencilset.json # 流程元素定义 webapp └── WEB-INF └── classes └── static └── modeler.html # 设计器入口页面关键配置点:
- 修改
editor-app/app-cfg.js中的服务路径:
var ACTIVITI = { CONFIG: { contextRoot: '/service', customStencilPath: '/static/stencilset.json' } };- 控制器类必须添加统一前缀:
@RestController @RequestMapping("/service") public class ModelEditorJsonRestResource { // 原有代码不变 }4. 实战中的性能优化技巧
在高并发场景下,原始配置可能成为性能瓶颈。通过以下调整可提升3-5倍吞吐量:
连接池优化参数:
spring: activiti: datasource: druid: initial-size: 10 min-idle: 10 max-active: 50 validation-query: SELECT 1 test-while-idle: true time-between-eviction-runs-millis: 60000异步执行器配置(在ProcessEngineConfiguration中添加):
config.setAsyncExecutorActivate(true); config.setAsyncExecutorNumberOfRetries(3); config.setAsyncExecutorThreadPoolQueueSize(100);历史数据分级策略:
config.setHistoryLevel(HistoryLevel.AUDIT); // 或使用自定义级别 config.setCustomHistoryLevel(new CustomHistoryLevel());这些配置需要根据实际业务场景调整,特别是在流程实例量超过1万时效果显著。
