接管SpringBoot對Activiti的數據源自動配置


SpringBoot的自動配置真的讓人又愛又恨,但還是愛更多一點。

SpringBoot想要幫我們自動配置好一切,但是有時候配置的卻並不是我們需要的,甚至有時候會默默的坑我們。

我的項目是一個多數據源的項目(多數據源戳這里),其中有一個主數據源configDataSource,用來存放配置的庫,我又新建了一個activitiDataSource,想要存放activiti的工作表。但是springboot卻把configDataSource配置為了Activiti的庫。

不想把activiti的自動配置關掉,畢竟用起來還是很方便的。那么只能更改springboot對activiti的默認配置了,經過實踐可以使用如下方式:注釋解釋的很清楚了,就不啰嗦了。

/** * @author kingboy--KingBoyWorld@163.com * @date 2017/8/30 上午12:54 * @desc Activiti的數據和事物配置. */
@Configuration//聲名為配置類,繼承Activiti抽象配置類
public class ActivitiConfig extends AbstractProcessEngineAutoConfiguration {

    @Resource
    DataSource activitiDataSource;//注入配置好的數據源

    @Resource
    PlatformTransactionManager activitiTransactionManager;//注入配置好的事物管理器

    //注入數據源和事務管理器
    @Bean
    public SpringProcessEngineConfiguration springProcessEngineConfiguration( SpringAsyncExecutor springAsyncExecutor) throws IOException {
        return this.baseSpringProcessEngineConfiguration(activitiDataSource, activitiTransactionManager, springAsyncExecutor);
    }
}
    
    
   
  
  
          

到這里就搞定了,springboot就會使用我們聲名的數據源來配置Activiti了。

下面附上我的數據源和事物管理器的配置。

配置文件:

#-----------------------------------數據源配置-----------------------------
#activiti數據源
spring.datasource.activiti.url=jdbc:mysql://localhost:3306/activiti?characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false
spring.datasource.activiti.username=root
spring.datasource.activiti.password=123456
spring.datasource.activiti.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.activiti.maxActive=20
spring.datasource.activiti.initialSize=5
spring.datasource.activiti.minIdle=5
spring.datasource.activiti.maxWait=60000
spring.datasource.activiti.maxPoolPreparedStatementPerConnectionSize=20
spring.datasource.activiti.timeBetweenEvictionRunsMillis=60000
spring.datasource.activiti.minEvictableIdleTimeMillis=300000
spring.datasource.activiti.poolPreparedStatements=true
    
    
   
  
  
          

配置類

1.屬性讀取 ActivitiDataSourceProperties.java

package com.kingboy.activiti.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/** * @author kingboy * @date 2017/6/19 下午5:15 * @desc configuration的數據池屬性 */
@ConfigurationProperties(prefix = "spring.datasource.activiti")
@Data
@Component
public class ActivitiDataSourceProperties {

    private String url;

    private String username;

    private String password;

    private String driverClassName;

    private Integer maxActive;

    private Integer initialSize;

    private Integer minIdle;

    private Integer maxWait;

    private Integer maxPoolPreparedStatementPerConnectionSize;

    private Integer timeBetweenEvictionRunsMillis;

    private Integer minEvictableIdleTimeMillis;

    private Boolean poolPreparedStatements;

}

    
    
   
  
  
          
  1. 數據源和事物配置ActivitiJPAConfig.java
/** * @author kingboy * @date 2017/6/18 下午11:13 * @desc 數據源配置 */
@Configuration
@EnableTransactionManagement//開啟事物管理
@EnableJpaRepositories(//自定義數據管理的配置
        //指定EntityManager的創建工廠Bean
        entityManagerFactoryRef = "activitiEntityManagerFactory",
        //指定事物管理的Bean
        transactionManagerRef = "activitiTransactionManager",
        //指定管理的實體位置
        basePackages = {"com.kingboy.activiti.domain"})
public class ActivitiJPAConfig {

    /* * 配置數據源 */
    @Bean
    public DataSource activitiDataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        //設置數據源的屬性
        setDruidProperties(dataSource);
        return dataSource;
    }


    //注入數據源配置信息
    @Autowired
    ActivitiDataSourceProperties config;

    //設置數據源的屬性的方法
    private void setDruidProperties(DruidDataSource dataSource) {
        dataSource.setUrl(config.getUrl());
        dataSource.setUsername(config.getUsername());
        dataSource.setPassword(config.getPassword());
        dataSource.setDriverClassName(config.getDriverClassName());
        dataSource.setMaxActive(config.getMaxActive());
        dataSource.setInitialSize(config.getInitialSize());
        dataSource.setMinIdle(config.getMinIdle());
        dataSource.setMaxWait(config.getMaxWait());
        dataSource.setMaxPoolPreparedStatementPerConnectionSize(config.getMaxPoolPreparedStatementPerConnectionSize());
        dataSource.setTimeBetweenEvictionRunsMillis(config.getTimeBetweenEvictionRunsMillis());
        dataSource.setMinEvictableIdleTimeMillis(config.getMinEvictableIdleTimeMillis());
        dataSource.setPoolPreparedStatements(config.getPoolPreparedStatements());
    }

    /* * 配置實體管理工廠Bean */
    @Bean
    public LocalContainerEntityManagerFactoryBean activitiEntityManagerFactory(EntityManagerFactoryBuilder builder) {
        return builder
                .dataSource(activitiDataSource())
                .packages("com.kingboy.activiti.domain")//設置實體類所在位置
                .persistenceUnit("activiti")
                .properties(getProperties(activitiDataSource()))//設置hibernate通用配置
                .build();
    }

    //注入spring自帶的jpa屬性類
    @Autowired
    private JpaProperties jpaProperties;

    /* *拿到hibernate的通用配置 */
    private Map<String, String> getProperties(DataSource dataSource) {
        return jpaProperties.getHibernateProperties(dataSource);
    }

    /* *配置事物管理的Bean */
    @Bean
    public PlatformTransactionManager activitiTransactionManager(EntityManagerFactoryBuilder builder) {
        return new JpaTransactionManager(activitiEntityManagerFactory(builder).getObject());
    }


}

    
    
   
  
  
          
原文地址:https://blog.csdn.net/KingBoyWorld/article/details/77703565


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM