配置默认spring.datasource启动JDBC模式Quartz集群报错如何解决?
核心是依赖版本完全不匹配:你引入的spring-boot-starter-quartz:2.7.0是适配Spring Boot 2.x版本的组件,但实际运行环境的Spring Boot核心版本为v1.5.22.RELEASE。1.5.x版本没有内置2.x才有的Quartz自动配置逻辑,你参考的高版本Quartz自动装配规则在当前环境下全部不生效。
对应报错的具体原因
- 关于
RAMJobStore不存在tablePrefix属性setter方法的报错:
Spring Boot 1.5.x不会在识别到spring.quartz.job-store-type=jdbc配置时自动切换JobStore实现、自动绑定数据源。你配置了JDBC存储专属的tablePrefix参数,但Quartz仍按默认规则初始化内存存储RAMJobStore,内存存储本身没有tablePrefix配置项,直接触发参数不匹配错误。
你观察到HikariCP连接池、JPA正常初始化,仅能说明主数据源本身配置正确,1.5.x的自动配置体系根本没有写Quartz和主数据源的绑定逻辑,自然无法识别到现有可用的数据源。 - 关于手动指定
LocalDataSourceJobStore后抛出There is no DataSource named 'null'的报错:
手动指定JDBC存储类的思路是对的,但LocalDataSourceJobStore需要显式注入数据源实例才能工作,1.5.x环境不会自动把主数据源绑定给Quartz组件,Quartz启动时找不到关联的数据源,就会抛出空名称数据源的错误。
二选一即可:
方案一(推荐):全量对齐Spring Boot依赖版本
将项目中所有Spring Boot关联依赖(包括spring-boot-starter-quartz、spring-boot-starter-data-jpa、spring-boot-starter-jdbc、spring-boot-autoconfigure等)的版本统一对齐,要么全部升级到2.7.0,要么全部降级到和1.5.22.RELEASE匹配的版本。
如果统一升级到2.7.0版本,直接删除手动添加的org.quartz.jobStore.class=org.springframework.scheduling.quartz.LocalDataSourceJobStore配置,仅保留spring.quartz.job-store-type=jdbc即可,Quartz自动配置会自动识别现有Hikari数据源,完成JDBC持久化的全部装配工作,不需要额外手动绑定。
方案二:保留1.5.22版本,手动完成Quartz配置
如果受项目限制无法升级Spring Boot版本,就不要依赖高版本的自动配置逻辑,手动编写Quartz配置:
- 删除配置文件中所有
spring.quartz.*开头的配置项,1.5.x版本无法识别这类配置 - 新建Quartz配置类,手动将主数据源注入到Scheduler工厂中,参考代码如下:
@Configuration public class QuartzConfig { @Autowired private DataSource primaryDataSource; @Bean public SchedulerFactoryBean quartzClusteredScheduler() { SchedulerFactoryBean factory = new SchedulerFactoryBean(); // 手动绑定主数据源 factory.setDataSource(primaryDataSource); Properties quartzProps = new Properties(); quartzProps.put("org.quartz.jobStore.class", "org.springframework.scheduling.quartz.LocalDataSourceJobStore"); quartzProps.put("org.quartz.jobStore.tablePrefix", "QRTZ_"); quartzProps.put("org.quartz.jobStore.isClustered", "true"); // 线程池、集群实例ID等其他配置按需添加 factory.setQuartzProperties(quartzProps); return factory; } }
注意:启用JDBC持久化前,需要先在对应MySQL库中执行匹配Quartz版本的表初始化脚本,否则启动时会报表不存在的错误。
内容的提问来源于stack exchange,提问作者gabriel

