写在前面
在开始之前请先阅读:
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官网-配置说明文档进行独立数据源的配置,一直不生效,仍然使用业务库的数据源。
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)项目默认使用主数据源