Springboot2.1.x配置Activiti7單獨數(shù)據(jù)源問題
簡介
最近基于最新的Activiti7
配置了SpringBoot2
竹揍。
簡單上手使用了一番敬飒。發(fā)現(xiàn)市面上解決Activiti7
的教程很少,采坑也比較多芬位,在Activiti6
配置數(shù)據(jù)源和Activiti7
有所區(qū)別无拗,基于Activiti6
在Activiti7
里是無法正常使用的。接下來讓我們看下區(qū)別昧碉。
問題
Activiti6
多數(shù)據(jù)源配置
6的配置比較簡單點英染。
- 先加入配置:
# activiti 數(shù)據(jù)源
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
用
@ConfigurationProperties
加載以spring.datasource.activiti
開頭的DataSource
。創(chuàng)建
ActivitiConfig
繼承AbstractProcessEngineAutoConfiguration
方法注入SpringProcessEngineConfiguration
bean,調(diào)用AbstractProcessEngineAutoConfiguration#baseSpringProcessEngineConfiguration
方法把創(chuàng)建的數(shù)據(jù)源注入被饿。
@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
的數(shù)據(jù)源已經(jīng)配置完成四康,如果是7的話會發(fā)現(xiàn)AbstractProcessEngineAutoConfiguration#baseSpringProcessEngineConfiguration
方法已經(jīng)不存在了,我們需要產(chǎn)考源碼構(gòu)建方式改造一番狭握。
修復(fù)
Activiti7
多數(shù)據(jù)源配置
配置還是要上面的闪金。
創(chuàng)建
ActivitiConfig
繼承AbstractProcessEngineAutoConfiguration
方法注入SpringProcessEngineConfiguration
bean。用
@ConfigurationProperties
加載以spring.datasource.activiti
開頭的DataSource
@Configuration
public class ActivitiConfig extends AbstractProcessEngineAutoConfiguration {
@Bean
@ConfigurationProperties(prefix = "spring.datasource.activiti")
public DataSource activitiDataSource() {
return DataSourceBuilder.create().build();
}
...略
}
-
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 數(shù)據(jù)源
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錯誤
# 官方文檔的解釋是:
# 因為連接池的實際類型沒有被公開论颅,所以在您的自定義數(shù)據(jù)源的元數(shù)據(jù)中沒有生成密鑰哎垦,而且在IDE中沒有完成(因為DataSource接口沒有暴露屬性)。
# 另外恃疯,如果您碰巧在類路徑上有Hikari撼泛,那么這個基本設(shè)置就不起作用了,因為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
總結(jié)
Activiti7
國內(nèi)的教程不是很多,需要自己在社區(qū)里或者官方文檔蛙奖,源碼去看了解潘酗,細(xì)心學(xué)習(xí)。
示例代碼地址:activiti-starter
作者GitHub:
Purgeyao 歡迎關(guān)注