Spring Boot 1.5.8升级至2.0.1时Quartz配置问题求助
嘿,我帮你梳理下Spring Boot从1.5.8升级到2.0.1时Quartz组件遇到的问题——结合你提到的用Spring BOM管理Quartz 2.3.0,还有那段截断的QuartzConfigurer代码,我整理了几个最常见的坑和解决思路:
Spring Boot 1.5.8 → 2.0.1 Quartz升级问题排查与解决
先看你提供的代码片段(格式化后)
import lombok.extern.slf4j.Slf4j; import org.quartz.JobDetail; import org.quartz.Trigger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.ApplicationContext; import org.springframework.conte...
从这段代码能看出你在尝试通过ApplicationContext实现Quartz Job与Spring Bean的联动,这也是升级时最容易出问题的点之一,结合Spring Boot 2.0的变化,给你拆解解决方案:
1. 核心变化:Spring Boot 2.0的Quartz自动配置
Spring Boot 2.0新增了QuartzAutoConfiguration自动配置类,替代了1.5.x里手动配置SchedulerFactoryBean的大部分工作。如果你的QuartzConfigurer是自定义配置,需要注意:
- 不再需要硬编码
SchedulerFactoryBean的基础属性(比如数据源、线程池),Spring Boot会通过QuartzProperties自动绑定配置文件中的参数 - 自定义配置时,只需要补充业务特有的
JobDetail、Trigger,以及自定义JobFactory(如果需要Spring注入Bean到Job中)
2. Job获取Spring Bean的正确姿势
你代码里注入ApplicationContext,应该是为了让Quartz Job能使用Spring容器里的Bean。在Spring Boot 2.0 + Quartz 2.3.0下,正确的实现方式是自定义SpringBeanJobFactory的子类:
@Slf4j @Configuration public class QuartzConfigurer { @Autowired private ApplicationContext applicationContext; // 自定义JobFactory,让Spring能自动注入Job里的Bean @Bean public SpringBeanJobFactory customJobFactory() { AutowiringJobFactory jobFactory = new AutowiringJobFactory(); jobFactory.setApplicationContext(applicationContext); return jobFactory; } // 配置SchedulerFactoryBean,指定自定义的JobFactory @Bean public SchedulerFactoryBean schedulerFactoryBean(Trigger myTrigger, JobDetail myJobDetail) { SchedulerFactoryBean scheduler = new SchedulerFactoryBean(); scheduler.setJobFactory(customJobFactory()); scheduler.setJobDetails(myJobDetail); scheduler.setTriggers(myTrigger); // 其他自定义配置(比如启动延迟、是否自动启动) return scheduler; } // 示例:定义JobDetail @Bean public JobDetail myJobDetail() { return JobBuilder.newJob(MyBusinessJob.class) .withIdentity("myBusinessJob") .storeDurably(true) // 即使没有Trigger关联也保留Job .build(); } // 示例:定义Trigger @Bean public Trigger myJobTrigger() { SimpleScheduleBuilder schedule = SimpleScheduleBuilder.simpleSchedule() .withIntervalInMinutes(30) .repeatForever(); return TriggerBuilder.newTrigger() .forJob(myJobDetail()) .withIdentity("myBusinessTrigger") .withSchedule(schedule) .build(); } // 内部类:实现Spring Bean的自动注入逻辑 private static class AutowiringJobFactory extends SpringBeanJobFactory { private ApplicationContext applicationContext; public void setApplicationContext(ApplicationContext applicationContext) { this.applicationContext = applicationContext; } @Override protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception { Object jobInstance = super.createJobInstance(bundle); // 让Spring自动注入Job里的@Autowired属性 applicationContext.getAutowireCapableBeanFactory().autowireBean(jobInstance); return jobInstance; } } }
3. 依赖版本冲突排查
虽然你用了Spring BOM,但还是要确认是否有其他依赖偷偷引入了旧版本Quartz。可以用Maven命令查看依赖树:
mvn dependency:tree | grep quartz
如果发现有低版本Quartz,在对应依赖里排除掉:
<dependency> <groupId>xxx</groupId> <artifactId>xxx</artifactId> <exclusions> <exclusion> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> </exclusion> </exclusions> </dependency>
4. 配置文件的适配
Spring Boot 2.0的Quartz配置前缀统一为spring.quartz.*,替代了1.5.x可能的自定义配置,示例配置:
# Quartz存储类型:内存/数据库 spring.quartz.job-store-type=jdbc # 自动初始化Quartz表结构(首次启动用) spring.quartz.jdbc.initialize-schema=always # Quartz调度器名称 spring.quartz.properties.org.quartz.scheduler.instanceName=MyAppScheduler # 数据库表前缀 spring.quartz.properties.org.quartz.jobStore.tablePrefix=QRTZ_
内容的提问来源于stack exchange,提问作者doublemc
相关产品推荐
相关产品推荐

