Springboot2.1.x配置Activiti7单独数据源问题

简介

最近基于最新的Activiti7配置了SpringBoot2

简单上手使用了一番。发现市面上解决Activiti7的教程很少,采坑也比较多,在Activiti6配置数据源和Activiti7有所区别,基于Activiti6Activiti7里是无法正常使用的。接下来让我们看下区别。

问题

Activiti6多数据源配置

6的配置比较简单点。

  1. 先加入配置:
# activiti 数据源
spring.datasource.activiti.driver=com.mysql.jdbc.Driver
spring.datasource.activiti.url=jdbc:mysql://10.1.1.97:3311/test-activiti7-db?useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true
spring.datasource.activiti.username=root
spring.datasource.activiti.password=Rtqw123OpnmER
spring.datasource.activiti.driverClassName=com.mysql.jdbc.Driver
  1. @ConfigurationProperties加载以spring.datasource.activiti开头的DataSource

  2. 创建ActivitiConfig继承AbstractProcessEngineAutoConfiguration方法注入SpringProcessEngineConfigurationbean,调用AbstractProcessEngineAutoConfiguration#baseSpringProcessEngineConfiguration方法把创建的数据源注入。

@Configuration
public class ActivitiConfig extends AbstractProcessEngineAutoConfiguration { @Bean
@ConfigurationProperties(prefix = "spring.datasource.activiti")
public DataSource activitiDataSource() {
return DataSourceBuilder.create().build();
} @Bean
public SpringProcessEngineConfiguration springProcessEngineConfiguration(
PlatformTransactionManager transactionManager,
SpringAsyncExecutor springAsyncExecutor) throws IOException { return baseSpringProcessEngineConfiguration(
activitiDataSource(),
transactionManager,
springAsyncExecutor);
}
}

Activiti6的数据源已经配置完成,如果是7的话会发现AbstractProcessEngineAutoConfiguration#baseSpringProcessEngineConfiguration方法已经不存在了,我们需要产考源码构建方式改造一番。

修复

Activiti7多数据源配置

配置还是要上面的。

  1. 创建ActivitiConfig继承AbstractProcessEngineAutoConfiguration方法注入SpringProcessEngineConfigurationbean。

  2. @ConfigurationProperties加载以spring.datasource.activiti开头的DataSource

@Configuration
public class ActivitiConfig extends AbstractProcessEngineAutoConfiguration { @Bean
@ConfigurationProperties(prefix = "spring.datasource.activiti")
public DataSource activitiDataSource() {
return DataSourceBuilder.create().build();
} ...略
}
  1. SpringProcessEngineConfiguration注入方式改为下面:
  @Bean
@Primary
public SpringProcessEngineConfiguration springProcessEngineConfiguration(
PlatformTransactionManager transactionManager,
SpringAsyncExecutor springAsyncExecutor,
ActivitiProperties activitiProperties,
ProcessDefinitionResourceFinder processDefinitionResourceFinder,
@Autowired(required = false) DefaultActivityBehaviorFactoryMappingConfigurer processEngineConfigurationConfigurer,
@Autowired(required = false) List<ProcessEngineConfigurator> processEngineConfigurators,
UserGroupManager userGroupManager,
DataSource dataSource) throws IOException { SpringProcessEngineConfiguration conf = new SpringProcessEngineConfiguration();
conf.setConfigurators(processEngineConfigurators);
configureProcessDefinitionResources(processDefinitionResourceFinder,
conf);
conf.setDataSource(dataSource);
conf.setTransactionManager(transactionManager); if (springAsyncExecutor != null) {
conf.setAsyncExecutor(springAsyncExecutor);
}
conf.setDeploymentName(activitiProperties.getDeploymentName());
conf.setDatabaseSchema(activitiProperties.getDatabaseSchema());
conf.setDatabaseSchemaUpdate(activitiProperties.getDatabaseSchemaUpdate());
conf.setDbHistoryUsed(activitiProperties.isDbHistoryUsed());
conf.setAsyncExecutorActivate(activitiProperties.isAsyncExecutorActivate());
if (!activitiProperties.isAsyncExecutorActivate()) {
ValidatorSet springBootStarterValidatorSet = new ValidatorSet("activiti-spring-boot-starter");
springBootStarterValidatorSet.addValidator(new AsyncPropertyValidator());
if (conf.getProcessValidator() == null) {
ProcessValidatorImpl processValidator = new ProcessValidatorImpl();
processValidator.addValidatorSet(springBootStarterValidatorSet);
conf.setProcessValidator(processValidator);
} else {
conf.getProcessValidator().getValidatorSets().add(springBootStarterValidatorSet);
}
}
conf.setMailServerHost(activitiProperties.getMailServerHost());
conf.setMailServerPort(activitiProperties.getMailServerPort());
conf.setMailServerUsername(activitiProperties.getMailServerUserName());
conf.setMailServerPassword(activitiProperties.getMailServerPassword());
conf.setMailServerDefaultFrom(activitiProperties.getMailServerDefaultFrom());
conf.setMailServerUseSSL(activitiProperties.isMailServerUseSsl());
conf.setMailServerUseTLS(activitiProperties.isMailServerUseTls()); if (userGroupManager != null) {
conf.setUserGroupManager(userGroupManager);
} conf.setHistoryLevel(activitiProperties.getHistoryLevel());
conf.setCopyVariablesToLocalForTasks(activitiProperties.isCopyVariablesToLocalForTasks());
conf.setSerializePOJOsInVariablesToJson(activitiProperties.isSerializePOJOsInVariablesToJson());
conf.setJavaClassFieldForJackson(activitiProperties.getJavaClassFieldForJackson()); if (activitiProperties.getCustomMybatisMappers() != null) {
conf.setCustomMybatisMappers(
getCustomMybatisMapperClasses(activitiProperties.getCustomMybatisMappers()));
} if (activitiProperties.getCustomMybatisXMLMappers() != null) {
conf.setCustomMybatisXMLMappers(
new HashSet<>(activitiProperties.getCustomMybatisXMLMappers()));
} if (activitiProperties.getCustomMybatisXMLMappers() != null) {
conf.setCustomMybatisXMLMappers(
new HashSet<>(activitiProperties.getCustomMybatisXMLMappers()));
} if (activitiProperties.isUseStrongUuids()) {
conf.setIdGenerator(new StrongUuidGenerator());
} if (activitiProperties.getDeploymentMode() != null) {
conf.setDeploymentMode(activitiProperties.getDeploymentMode());
} conf.setActivityBehaviorFactory(new DefaultActivityBehaviorFactory()); if (processEngineConfigurationConfigurer != null) {
processEngineConfigurationConfigurer.configure(conf);
} return conf;
} private void configureProcessDefinitionResources(
ProcessDefinitionResourceFinder processDefinitionResourceFinder,
SpringProcessEngineConfiguration conf) throws IOException {
List<Resource> procDefResources = processDefinitionResourceFinder
.discoverProcessDefinitionResources();
if (!procDefResources.isEmpty()) {
conf.setDeploymentResources(procDefResources.toArray(new Resource[0]));
}
}

常见错误

在以上配置中可能会有jdbcUrl is required with driverClassName错误

解决办法如下:

# activiti 数据源
spring.datasource.activiti.driver=com.mysql.jdbc.Driver
spring.datasource.activiti.url=jdbc:mysql://10.1.1.97:3311/test-activiti7-db?useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true
# url换为jdbc-url 解决jdbcUrl is required with driverClassName错误
# 官方文档的解释是:
# 因为连接池的实际类型没有被公开,所以在您的自定义数据源的元数据中没有生成密钥,而且在IDE中没有完成(因为DataSource接口没有暴露属性)。
# 另外,如果您碰巧在类路径上有Hikari,那么这个基本设置就不起作用了,因为Hikari没有url属性(但是确实有一个jdbcUrl属性)。在这种情况下,您必须重写您的配置如下:
spring.datasource.activiti.jdbc-url=${spring.datasource.activiti.url}
spring.datasource.activiti.username=root
spring.datasource.activiti.password=Rtqw123OpnmER
spring.datasource.activiti.driverClassName=com.mysql.jdbc.Driver

总结

Activiti7国内的教程不是很多,需要自己在社区里或者官方文档,源码去看了解,细心学习。

示例代码地址:activiti-starter

作者GitHub:

Purgeyao 欢迎关注

最新文章

  1. docker-8 docker小技巧
  2. VS2010+64+OSG3.2.1之五Plugins dae编译
  3. JavaScript-也来谈--闭包
  4. 根据不同的实体及其ID来获取数据库中的数据
  5. &lt;c:if&gt;条件判断 和 取值做乘法运算
  6. JSP for query
  7. cts 测试环境安装 ubuntu
  8. linux/win7下安装websphere application server
  9. php读取access数据库
  10. 补充Mysql5.7用法
  11. c#委托中的同步和异步方法即BeginInvoke和EndInvoke
  12. 【转】在Linux下安装python3
  13. 第25月第15天 udacity cs253
  14. ReactiveX 学习笔记(21)使用 Rx.NET + ReactiveUI 进行 GUI 编程
  15. sql最简单的查询语句
  16. sublime text 3配置c/c++编译环境
  17. centos7+hadoop完全分布式集群搭建
  18. OAF 功能中的参数含义
  19. log4j记录日志到指定文件
  20. hdu 4003(树形dp)

热门文章

  1. .Net Core 三大Redis客户端对比和使用心得
  2. python入门(三)列表、元组、range()、字典
  3. Docker Machine的使用
  4. 用故事解析setTimeout和setInterval(内含js单线程和任务队列)
  5. 牛客暑假多校第二场 K carpet
  6. lightoj 1134 - Be Efficient(组合数)
  7. CF - 1110 C Meaningless Operations
  8. Codeforces 734D. Anton and Chess(模拟)
  9. codeforces 509 E. Pretty Song(前缀和+前缀和的前缀和)
  10. js中的this介绍