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 groupIdorg.activiti/groupId artifactIdactiviti-spring/artifactId version5.22.0/version exclusions exclusion groupIdorg.springframework.security/groupId artifactIdspring-security-config/artifactId /exclusion !-- 必须同时排除以下两个相关依赖 -- exclusion groupIdorg.springframework.security/groupId artifactIdspring-security-web/artifactId /exclusion exclusion groupIdorg.springframework.security/groupId artifactIdspring-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配置类需要重写ProcessEngineConfigurationConfiguration 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万时效果显著。