SpringBoot - 集成Quartz框架之独立数据源(四)

写在前面

在开始之前请先阅读:
SpringBoot - 集成Quartz框架之CRON表达式
SpringBoot - 集成Quartz框架之Quartz简介(一)
SpringBoot - 集成Quartz框架之常用配置(二)
SpringBoot - 集成Quartz框架之具体步骤(三)
SpringBoot - 集成Quartz框架之独立数据源(四)
SpringBoot - 集成Quartz框架之常见问题(五)
SpringBoot - 集成Quartz框架之@DisallowConcurrentExecution注解详解(六)

接下里的操作步骤是在上一篇:SpringBoot - 集成Quartz框架之具体步骤(三)的基础上进行修改的。

具体步骤

1. 添加依赖

添加新的依赖使得项目支持动态数据源的切换。

<!-- 数据库连接池 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
</dependency>

<!-- 动态数据源 -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
</dependency>
2. 修改配置

修改application.yml,使得项目能够支持多数据源的配置。

# 数据源配置
spring:
  datasource:
    druid:
      stat-view-servlet:
        enabled: true
        loginUsername: admin
        loginPassword: 123456
    dynamic:
      # 默认值为: master。用于设置默认的数据源或者数据源组
      primary: master
      # 是否启用严格模式, 默认值为false, 表示不启动。 如果启动后当未匹配到指定数据源时回抛出异常, 如果不启动当未匹配到指定数据源时会使用默认数据源.比如: 当代码中切换数据源为@DS("h2"), 因为没有配置名称为h2的数据源, 所以会使用默认的数据源master。
      strict: false
      druid:
        initial-size: 5
        min-idle: 5
        maxActive: 20
        maxWait: 60000
        timeBetweenEvictionRunsMillis: 60000
        minEvictableIdleTimeMillis: 300000
        validationQuery: SELECT 1 FROM DUAL
        testWhileIdle: true
        testOnBorrow: false
        testOnReturn: false
        poolPreparedStatements: true
        maxPoolPreparedStatementPerConnectionSize: 20
        filters: stat,wall,slf4j
        connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
      datasource:
        # 主库数据源
        master:
          driver-class-name: org.postgresql.Driver
          url: jdbc:postgresql://localhost:5432/servicex-business?useUnicode=true&characterEncoding=utf-8&autoReconnect-true&useSSL=false&serverTimezone=Asia/Shanghai
          username: root
          password: 123456
        # 从库数据源
        quartz:
          driver-class-name: org.postgresql.Driver
          url: jdbc:postgresql://localhost:5432/servicex-quartz?useUnicode=true&characterEncoding=utf-8&autoReconnect-true&useSSL=false&serverTimezone=Asia/Shanghai
          username: root
          password: 123456
3. 添加数据源配置类
@Configuration
public class ServicexDataSourceConfig {
    @Primary
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.dynamic.datasource.master")
    public DruidDataSource servicexBusinessDataSource() {
        return new DruidDataSource();
    }
    
    @Bean
    @QuartzDataSource
    @ConfigurationProperties(prefix = "spring.datasource.dynamic.datasource.quartz")
    public DruidDataSource servicexQuartzDataSource() {
        return new DruidDataSource();
    }
}
4. 修改调度器工厂
@Configuration
public class SchedulerConfig {

    // 配置文件路径
    private static final String SERVICEX_QUARTZ_CONFIG_PATH = "/servicex-quartz.properties";

    // 控制器工厂类
    @Bean
    public SchedulerFactoryBean schedulerFactoryBean(@Qualifier("servicexQuartzDataSource") DruidDataSource dataSource) {
        SchedulerFactoryBean factory = new SchedulerFactoryBean();
        factory.setDataSource(dataSource);
        factory.setQuartzProperties(quartzProperties());
        factory.setStartupDelay(1);
        factory.setApplicationContextSchedulerContextKey("SERVICEX-APPLICATION-CONTEXT-KEY");
        factory.setOverwriteExistingJobs(true);
        factory.setAutoStartup(true);
        return factory;
    }

    @Bean
    @ConditionalOnResource(resources = SERVICEX_QUARTZ_CONFIG_PATH)
    Properties quartzProperties() {
        try {
            PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean();
            propertiesFactoryBean.setLocation(new ClassPathResource(SERVICEX_QUARTZ_CONFIG_PATH));
            propertiesFactoryBean.afterPropertiesSet();
            Properties properties = propertiesFactoryBean.getObject();
            return properties;
        } catch (IOException e) {
            System.out.println("QUARTZ相关的配置文件不存在.");
            e.printStackTrace();
        }
        return null;
    }
}
5. 其他配置不变

其他的配置以及代码,与上一篇博文一样保持不变。

在servicex-quartz.properties配置文件中添加如下配置不起作用,指定数据源无效

QUARTZ官网-配置说明文档

按照QUARTZ官网-配置说明文档进行独立数据源的配置,一直不生效,仍然使用业务库的数据源。

在这里插入图片描述

org.quartz.jobStore.dataSource = SERVICEX-QUARTZ-DS

#============================================================================
# 4. 数据源配置
#============================================================================
org.quartz.dataSource.SERVICEX-QUARTZ-DS.connectionProvider.class = com.hadoopx.quartz.config.DruidConnectionProvider
org.quartz.dataSource.SERVICEX-QUARTZ-DS.driver = org.postgresql.Driver
org.quartz.dataSource.SERVICEX-QUARTZ-DS.URL = jdbc:postgresql://localhost:5432/servicex-quartz?useUnicode=true&characterEncoding=utf-8&autoReconnect-true&useSSL=false&serverTimezone=Asia/Shanghai
org.quartz.dataSource.SERVICEX-QUARTZ-DS.user = root
org.quartz.dataSource.SERVICEX-QUARTZ-DS.password = 123456
org.quartz.dataSource.SERVICEX-QUARTZ-DS.maxConnection = 5
org.quartz.dataSource.SERVICEX-QUARTZ-DS.validationQuery = SELECT 0 FROM DUAL

@QuartzDataSource的作用是什么?

Spring Boot (2.4.2)Reference Documentation
Spring Boot (2.4.2)关于QUARTZ的相关说明

当基于SpringBoot框架的项目与QUARTZ集成,且QUARTZ需要使用指定的数据源时,需要按下面的方案进行处理,其他的方案都不生效。@QuartzDataSource注解是SpringBoot提供的与QUARTZ集成时使用指定数据的方案。

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创建以及初始化时,都使用特定于QUARTZ制定的数据源。

使用要点:

(1)创建不同的数据源
(2)创建调度器工厂时指定QUARTZ使用的数据源
(3)项目支持多数据源的动态切换
(4)项目默认使用主数据源

源码、示例及DEMO

源码、示例及DEMO

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cloneme01

谢谢您的支持与鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值