You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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");
    }
}

问题原因

  1. LocalDataSourceJobStore是Spring封装的Quartz JobStore实现,会自动识别Spring容器中@QuartzDataSource标注的数据源,但它不支持集群模式,因此默认显示为NON_CLUSTERED。
  2. 原生JobStoreTX不会自动感知Spring容器中的DataSource Bean,仅通过Quartz自身配置寻找数据源,导致找不到quartzDataSource。
  3. 原配置未添加集群必需的属性(如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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 07:03:18