Spring Boot中为Quartz Scheduler配置独立Schema数据源
实现Spring Boot + Quartz 多Schema数据源拆分配置
1. 引入Quartz依赖
如果用Maven,在pom.xml中添加Spring Boot整合Quartz的starter:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency>
2. 配置双数据源(application.properties)
保留原有业务数据源配置,新增Quartz专属数据源的配置项,指定对应的schema:
# 业务主数据源 spring.datasource.url=jdbc:postgresql://localhost:5432/main-service spring.datasource.driver-class-name=org.postgresql.Driver spring.datasource.hikari.schema=main-service spring.datasource.username=${USER} spring.datasource.password=${PASSWORD} spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect spring.flyway.default-schema=main-service spring.flyway.create-schemas=true # Quartz专属数据源 spring.datasource.quartz.url=jdbc:postgresql://localhost:5432/main-service spring.datasource.quartz.driver-class-name=org.postgresql.Driver spring.datasource.quartz.hikari.schema=main-service-quartz spring.datasource.quartz.username=${USER} spring.datasource.quartz.password=${PASSWORD} # Quartz核心配置 spring.quartz.job-store-type=jdbc spring.quartz.jdbc.initialize-schema=always # 首次启动完成后可改为never spring.quartz.properties.org.quartz.jobStore.tablePrefix=QRTZ_ spring.quartz.properties.org.quartz.jobStore.dataSource=quartzDataSource
3. 编写数据源配置类
创建配置类,分别注册业务主数据源(标记@Primary避免冲突)和Quartz专属数据源(用@QuartzDataSource标记):
import com.zaxxer.hikari.HikariDataSource; 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 org.springframework.scheduling.quartz.QuartzDataSource; import javax.sql.DataSource; @Configuration public class DataSourceConfig { // 业务主数据源,标记@Primary确保Spring优先使用它处理业务 @Primary @Bean(name = "dataSource") @ConfigurationProperties(prefix = "spring.datasource") public DataSource businessDataSource() { return DataSourceBuilder.create().type(HikariDataSource.class).build(); } // Quartz专属数据源,@QuartzDataSource注解让Spring识别这是Quartz要用的数据源 @QuartzDataSource @Bean(name = "quartzDataSource") @ConfigurationProperties(prefix = "spring.datasource.quartz") public DataSource quartzDataSource() { return DataSourceBuilder.create().type(HikariDataSource.class).build(); } }
4. 配置Quartz调度器
创建Quartz配置类,注入Quartz专属数据源并设置到SchedulerFactoryBean中:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.quartz.SchedulerFactoryBean; import javax.sql.DataSource; @Configuration public class QuartzConfig { private final DataSource quartzDataSource; // 构造注入Quartz专属数据源 public QuartzConfig(@QuartzDataSource DataSource quartzDataSource) { this.quartzDataSource = quartzDataSource; } @Bean public SchedulerFactoryBean schedulerFactoryBean() { SchedulerFactoryBean schedulerFactory = new SchedulerFactoryBean(); // 指定Quartz使用专属数据源 schedulerFactory.setDataSource(quartzDataSource); // 可在此添加任务详情、触发器等自定义配置 return schedulerFactory; } }
可选:用Flyway管理Quartz表结构
如果希望用Flyway统一管理Quartz的表初始化,可新增Flyway配置类:
import org.flywaydb.core.Flyway; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.sql.DataSource; @Configuration public class QuartzFlywayConfig { private final DataSource quartzDataSource; public QuartzFlywayConfig(@QuartzDataSource DataSource quartzDataSource) { this.quartzDataSource = quartzDataSource; } @Bean(name = "quartzFlyway") public Flyway quartzFlyway() { return Flyway.configure() .dataSource(quartzDataSource) .locations("classpath:db/migration/quartz") // 存放Quartz迁移脚本的目录 .baselineOnMigrate(true) .createSchemas(true) .defaultSchema("main-service-quartz") .load(); } }
之后在resources/db/migration/quartz目录下放入Quartz官方提供的PostgreSQL初始化脚本(脚本可从Quartz官网获取对应版本的SQL文件)。
内容的提问来源于stack exchange,提问作者gexter
相关产品推荐
相关产品推荐

