Spring Boot集成Quartz Scheduler时集群功能无法生效问题
问题根因
- 你手动自定义了
SchedulerFactoryBeanBean,覆盖了Spring Boot自动配置的SchedulerFactoryBean实例。Spring Boot的QuartzAutoConfiguration自动配置类默认会读取application.yaml中spring.quartz前缀的所有配置,自动注入到内置的SchedulerFactoryBean中,你自行new的SchedulerFactoryBean没有绑定任何自定义配置,直接使用了Quartz默认参数:默认线程池大小为10、默认使用RAMJobStore内存作业存储(不支持持久化和集群)。 - 你自定义的
SchedulerFactoryBean也没有配置JDBC作业存储所需的数据源、事务管理器等必要参数,进一步导致JDBC存储和集群配置无法生效。
解决方案
推荐优先使用第一种方案,改动最小且符合Spring Boot约定:
方案1:删除自定义的SchedulerFactoryBean
Spring Boot自动配置的SchedulerFactoryBean会自动识别上下文中所有JobDetail、Trigger类型的Bean,自动绑定配置参数,你只需要保留JobDetail和CronTrigger的Bean定义即可。
如果需要设置ApplicationContextSchedulerContextKey,直接在application.yaml中添加配置即可:
spring: quartz: scheduler: context-key: your_quartz_application_context_value
方案2:手动给自定义SchedulerFactoryBean注入配置参数
如果你有特殊需求必须手动定义SchedulerFactoryBean,需要将Spring Boot加载好的Quartz配置、数据源、事务管理器等参数手动注入:
@Bean public SchedulerFactoryBean schedulerFactoryBean(QuartzProperties quartzProperties, DataSource dataSource, PlatformTransactionManager transactionManager) { SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean(); // 加载yaml中配置的所有quartz属性 schedulerFactoryBean.setQuartzProperties(quartzProperties.getProperties()); // 绑定触发器 schedulerFactoryBean.setTriggers(notificationCronTrigger().getObject()); // 设置上下文key schedulerFactoryBean.setApplicationContextSchedulerContextKey(QUARTZ_APPLICATION_CONTEXT); // 注入JDBC存储所需的数据源和事务管理器 schedulerFactoryBean.setDataSource(dataSource); schedulerFactoryBean.setTransactionManager(transactionManager); // 同步Spring Boot Quartz配置的其他默认参数 schedulerFactoryBean.setAutoStartup(quartzProperties.isAutoStartup()); schedulerFactoryBean.setOverwriteExistingJobs(quartzProperties.isOverwriteExistingJobs()); schedulerFactoryBean.setStartupDelay((int)quartzProperties.getStartupDelay().getSeconds()); return schedulerFactoryBean; }
修改完成后重启项目,日志会输出你配置的线程数和JobStoreTX作业存储,集群功能即可正常生效。
内容的提问来源于stack exchange,提问作者Jish Nair
相关产品推荐
相关产品推荐

