Springboot Quartz集群模式下数据源报错求助
Quartz集群模式下数据源找不到问题解决
问题背景
将Quartz Scheduler部署为集群模式时,切换到JobStoreTX配置后出现数据源找不到错误:JobStoreTX - Database connection shutdown unsuccessful. java.sql.SQLException: There is no DataSource named 'quartzDataSource',但非集群模式(默认LocalDataSourceJobStore)下数据库读写正常,且两种模式均确认quartzDataSource Bean已初始化。
环境配置:
- Spring Boot + Gradle
- SQL Server
- 依赖
org.springframework.boot:spring-boot-starter-quartz
原配置代码:
@Configuration @EnableAutoConfiguration public class QuartzConfiguration { private static final Logger LOG = LogManager.getLogger(QuartzConfiguration.class); @Primary @Bean() @QuartzDataSource @ConfigurationProperties(prefix = "spring.datasource") public DataSource quartzDataSource() { HikariDataSource dataSource = DataSourceBuilder.create().type(HikariDataSource.class).build(); return dataSource; } @PostConstruct public void validateQuartzDataSource() { LOG.info("Quartz DataSource bean should have been created"); } }
问题原因
LocalDataSourceJobStore是Spring封装的Quartz JobStore实现,会自动识别Spring容器中@QuartzDataSource标注的数据源,但它不支持集群模式,因此默认显示为NON_CLUSTERED。- 原生
JobStoreTX不会自动感知Spring容器中的DataSource Bean,仅通过Quartz自身配置寻找数据源,导致找不到quartzDataSource。 - 原配置未添加集群必需的属性(如
jobStore.isClustered=true、instanceId=AUTO),即使指定JobStoreTX也无法进入集群模式。
解决方案
修改配置类,通过SchedulerFactoryBean手动将Spring数据源注入Quartz,并配置完整的集群属性:
@Configuration public class QuartzConfiguration { private static final Logger LOG = LogManager.getLogger(QuartzConfiguration.class); @Bean @QuartzDataSource @ConfigurationProperties(prefix = "spring.datasource") public DataSource quartzDataSource() { return DataSourceBuilder.create().type(HikariDataSource.class).build(); } @Bean public SchedulerFactoryBean schedulerFactoryBean(DataSource quartzDataSource) { SchedulerFactoryBean schedulerFactory = new SchedulerFactoryBean(); // 将Spring数据源传递给Quartz schedulerFactory.setDataSource(quartzDataSource); Properties quartzProperties = new Properties(); // 指定集群用JobStore quartzProperties.setProperty("org.quartz.jobStore.class", "org.quartz.impl.jdbcjobstore.JobStoreTX"); // 启用集群模式 quartzProperties.setProperty("org.quartz.jobStore.isClustered", "true"); // 集群节点心跳间隔(毫秒) quartzProperties.setProperty("org.quartz.jobStore.clusterCheckinInterval", "20000"); // 自动生成实例ID,避免集群节点ID冲突 quartzProperties.setProperty("org.quartz.scheduler.instanceId", "AUTO"); // SQL Server专属数据源代理类,必须配置否则会有数据库适配问题 quartzProperties.setProperty("org.quartz.jobStore.driverDelegateClass", "org.quartz.impl.jdbcjobstore.MSSQLDelegate"); schedulerFactory.setQuartzProperties(quartzProperties); return schedulerFactory; } @PostConstruct public void validateQuartzDataSource() { LOG.info("Quartz DataSource bean should have been created"); } }
注意事项
- 确保SQL Server中已创建Quartz所需的集群表(可从Quartz官方SQL脚本获取对应版本的SQL Server脚本)。
- 集群中所有节点必须使用相同的Quartz版本、数据库配置和集群属性。
内容的提问来源于stack exchange,提问作者whatkeepsmesane
相关产品推荐
相关产品推荐

