Spring Boot 2.0集成Quartz:如何配置使用非主数据源
Spring Boot 2.0 配置Quartz使用非主数据源
没问题,我来帮你搞定Spring Boot 2.0里给Quartz指定非主数据源的配置,步骤清晰,跟着做就行:
1. 补充必要依赖
首先确保你的pom.xml里已经引入了Quartz和JDBC相关的starter,要是还没加,补充下面的依赖:
<dependencies> <!-- 主应用JDBC依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <!-- Quartz调度器依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency> <!-- 数据库驱动(以MySQL为例) --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> </dependencies>
2. 配置两个数据源
在application.yml(或application.properties)里分别配置主业务数据源和Quartz专用数据源:
spring: # 主业务数据源 datasource: url: jdbc:mysql://localhost:3306/business_db?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC username: business_user password: business_pass driver-class-name: com.mysql.cj.jdbc.Driver # Quartz专用数据源 scheduler: url: jdbc:mysql://localhost:3306/quartz_db?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC username: quartz_user password: quartz_pass driver-class-name: com.mysql.cj.jdbc.Driver # Quartz基础配置 quartz: job-store-type: jdbc jdbc: initialize-schema: always # 首次运行自动初始化Quartz表结构,后续可改为never
3. 手动注册数据源Bean
创建配置类,手动注册两个数据源的Bean,给主数据源标记@Primary确保业务代码默认使用它,Quartz数据源指定明确的名称:
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.jdbc.DataSourceBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import javax.sql.DataSource; @Configuration public class DataSourceConfig { // 主业务数据源,标记为Primary @Primary @Bean(name = "businessDataSource") @ConfigurationProperties(prefix = "spring.datasource") public DataSource businessDataSource() { return DataSourceBuilder.create().build(); } // Quartz专用数据源 @Bean(name = "schedulerDataSource") @ConfigurationProperties(prefix = "spring.datasource.scheduler") public DataSource schedulerDataSource() { return DataSourceBuilder.create().build(); } }
4. 配置Quartz绑定指定数据源
自定义Quartz的SchedulerFactoryBean,把我们的schedulerDataSource传入,覆盖Spring Boot默认的配置:
import org.quartz.Scheduler; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.quartz.QuartzProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.quartz.SchedulerFactoryBean; import javax.sql.DataSource; import java.util.Properties; @Configuration public class QuartzConfig { private final QuartzProperties quartzProperties; public QuartzConfig(QuartzProperties quartzProperties) { this.quartzProperties = quartzProperties; } @Bean public SchedulerFactoryBean schedulerFactoryBean(@Qualifier("schedulerDataSource") DataSource dataSource) { SchedulerFactoryBean factory = new SchedulerFactoryBean(); // 指定Quartz使用的数据源 factory.setDataSource(dataSource); // 加载Quartz的配置属性 Properties props = new Properties(); props.putAll(quartzProperties.getProperties()); factory.setQuartzProperties(props); // 配置启动时自动启动调度器 factory.setAutoStartup(true); return factory; } @Bean public Scheduler scheduler(SchedulerFactoryBean schedulerFactoryBean) { return schedulerFactoryBean.getScheduler(); } }
5. 可选:配置Quartz专用事务管理器
如果你的Quartz任务需要事务支持,可以给它配置专用的事务管理器:
import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.transaction.PlatformTransactionManager; import javax.sql.DataSource; @Configuration public class TransactionConfig { @Bean(name = "schedulerTransactionManager") public PlatformTransactionManager schedulerTransactionManager(@Qualifier("schedulerDataSource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } }
这样配置完成后,Quartz就会使用你指定的schedulerDataSource存储调度任务的元数据,主数据源依然正常供业务代码使用。
内容的提问来源于stack exchange,提问作者user1020455




