SpringBoot之獨立quartz數據源


背景:

  之前項目里面把quartz相關的表跟業務數據庫(涉及系統業務的庫)融合在一起,后面需要把quartz單獨拎出來放在一個數據庫里面,

       舊的數據源配置(application.properties),無其他,程序可以跑:    

spring.datasource.password=root
spring.datasource.username=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/fdata?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&serverTimezone=GMT%2B8

  

  quartz獨立數據庫:

  1、增加quartz數據源配置(application.properties):

# quartz datasource conf
spring.datasource.quartz.password=root
spring.datasource.quartz.username=root
spring.datasource.quartz.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.quartz.url=jdbc:mysql://localhost:3306/fdata_quartz_test?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true

  

  2、增加DataSourceConfig類

加入了上述配置但是這樣配置的datasouce並不生效,用的還是原來的數據庫。查了些網上的資料,要給scheduler單獨的dataSource,而且發現springboot文檔里有

"To have Quartz use a DataSource other than the application’s main DataSource, declare a DataSource bean, annotating its @Bean method with @QuartzDataSource. Doing so ensures that the Quartz-specific DataSource is used by both the SchedulerFactoryBean and for schema initialization."

翻譯:要讓Quartz使用除應用程序主數據源之外的其他數據源,需要聲明一個數據源bean,並用@QuartzDataSource注釋它的@Bean方法。這樣做可以確保SchedulerFactoryBean和模式初始化都使用特定於quartzs的數據源。

所以增加 DataSourceConfig類,如下:

 1 package com.xx.fdata.console.conf;
 2 import javax.sql.DataSource;
 3 import lombok.extern.slf4j.Slf4j;
 4 import org.apache.commons.dbcp.BasicDataSource;
 5 import org.springframework.boot.autoconfigure.quartz.QuartzDataSource;
 6 import org.springframework.boot.context.properties.ConfigurationProperties;
 7 import org.springframework.context.annotation.Bean;
 8 import org.springframework.context.annotation.Configuration;
 9 import org.springframework.context.annotation.Primary;
10 
11 @Slf4j
12 @Configuration
13 public class DataSourceConfig {
14 
15     /**
16      * 數據源配置的前綴,必須與application.properties中配置的對應數據源的前綴一致
17      */
18     private static final String BUSINESS_DATASOURCE_PREFIX = "spring.datasource";
19 
20     private static final String QUARTZ_DATASOURCE_PREFIX = "spring.datasource.quartz";
21 
22     @Primary
23     @Bean
24     @ConfigurationProperties(prefix = BUSINESS_DATASOURCE_PREFIX)
25     public BasicDataSource businessDataSource() {
26         return new BasicDataSource();
27     }
28 
29     /**
30      * @QuartzDataSource 注解則是配置Quartz獨立數據源的配置
31      */
32     @Bean
33     @QuartzDataSource
34     @ConfigurationProperties(prefix = QUARTZ_DATASOURCE_PREFIX)
35     public DataSource quartzDataSource(){
36         return new BasicDataSource();
37     }
38 }

  3、使用的是dbcp連接池,所以pom增加相應配置:

<dependency>
        <groupId>commons-dbcp</groupId>
        <artifactId>commons-dbcp</artifactId>
        <version>1.4</version>
</dependency>

  

參考資料:

  1、Springboot quartz 獨立數據源配置

  2、springboot 2.x 集成quartz持久化到一個單獨的dataSource時遇到的坑

    

補充:

  完成需求過程中最初是在quartz.properties里面增加quartzDataSource內容,但是沒什么效果,還是用的業務數據庫,后面就有了前面提到的DataSourceConfig類的誕生:

spring.quartz.properties.org.quartz.jobStore.dataSource=quartzDataSource

#數據源
spring.quartz.properties.org.quartz.dataSource.quartzDataSource.driver=com.mysql.jdbc.Driver
spring.quartz.properties.org.quartz.dataSource.quartzDataSource.URL=jdbc:mysql://localhost:3306/fdata_quartz_test?useUnicode=true&amp;characterEncoding=UTF-8&amp;allowMultiQueries=true
spring.quartz.properties.org.quartz.dataSource.quartzDataSource.user=root
spring.quartz.properties.org.quartz.dataSource.quartzDataSource.password=root
spring.quartz.properties.org.quartz.dataSource.quartzDataSource.validationQuery=select 1

 


免責聲明!

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



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