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

如何将Quartz指向Spring Boot自动配置的HikariCP数据源?

问题背景

应用通过properties配置文件定义了基础HikariCP数据源,配置如下:

spring.datasource.username=${database.username}
spring.datasource.password=${database.password}
spring.datasource.url=jdbc:mysql://${database.host}/databasename

上述配置可被HikariCP自动配置逻辑正常识别加载,但使用LocalDataSourceJobStore时,Quartz无法感知到该数据源。当前Quartz调度器XML配置如下:

<bean id="QuartzClusteredScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <!-- <property name="dataSource" ref="????"/> -->
    <property name="jobFactory">
        <bean class="com.example.scheduler.AutowiringSpringBeanJobFactory"/>
    </property>
    <property name="quartzProperties">
        <props>
            <prop key="org.quartz.jobStore.class">org.springframework.scheduling.quartz.LocalDataSourceJobStore</prop>
    <property name="jobDetails">
        <list>...

实际运行遇到两类报错:

  • 按Spring Quartz自动配置手册说明省略dataSource属性时,抛出异常:java.sql.SQLException: There is no DataSource named 'null'
  • 自定义配置spring.datasource.name=abc并在Quartz配置中引用该名称时,抛出无法找到abc或jdbc/abc的错误
正确配置方式

场景1:保留现有XML自定义SchedulerFactoryBean的配置

直接放开注释的dataSource属性,引用Spring容器中自动配置的默认HikariCP数据源即可,该数据源默认Bean名称为dataSource:

<property name="dataSource" ref="dataSource"/>

注意:配置完该属性后,不需要在quartzProperties节点下额外添加org.quartz.jobStore.dataSource相关参数,LocalDataSourceJobStore会直接使用注入的DataSource实例,不会走Quartz自身的数据源查找逻辑。

场景2:完全使用Spring Boot自动配置,不自定义SchedulerFactoryBean

删除自定义的Quartz XML配置,直接在application.properties中添加如下配置即可,自动配置逻辑会自动将主数据源注入Quartz调度器:

# 指定Quartz使用JDBC作业存储
spring.quartz.job-store-type=jdbc

如果使用的Spring Boot版本较低没有自动适配LocalDataSourceJobStore,可以额外添加一行配置:

spring.quartz.properties.org.quartz.jobStore.class=org.springframework.scheduling.quartz.LocalDataSourceJobStore
报错原因说明
  1. 省略dataSource属性时,SchedulerFactoryBean不会主动注入Spring容器中的数据源,LocalDataSourceJobStore会尝试按Quartz内置配置的数据源名称查找资源,未配置名称时拿到null值,直接抛出对应异常。
  2. 配置spring.datasource.name不会将数据源注册到Quartz的内置查找上下文,也不会自动注册为JNDI资源,因此直接在Quartz配置中引用自定义名称必然会报找不到资源的错误。

如果项目中配置了多数据源,需要给Quartz要使用的数据源Bean添加@Primary注解,或在XML配置的ref属性中明确指定目标数据源的Bean名称。


内容的提问来源于stack exchange,提问作者gabriel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 10:45:38