问题排查 Active Scheduler of name 'MyClusterScheduler' already registered in Quartz SchedulerRepository.

在SpringBoot应用中集成Quartz2.3.0时,由于本地quartz.properties配置文件与系统默认文件同名,导致工程启动时Scheduler被重复实例化,从而引发'Active Scheduler of name 'MyClusterScheduler' already registered in Quartz SchedulerRepository.'的错误。通过断点调试源码,发现问题根源在于QuartzInitializerListener和QuartzConfig.java中的Scheduler创建过程,需要避免配置文件冲突。

一、Error日志&原因

最近在搞Springboot整合Quartz2.3.0的时候遇到了一个诡异的问题,工程启动不起来。

错误log:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'schedulerFactoryBean' defined in class path resource [com/nana/matrix/timer/quartz/QuartzConfig.class]: Invocation of init method failed; nested exception is java.lang.IllegalStateException: Active Scheduler of name 'MyClusterScheduler' already registered in Quartz SchedulerRepository. Cannot create a new Spring-managed Scheduler of the same name!
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1803)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:595)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517)
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
	at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1287)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1207)
	at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:874)
	at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:778)
	... 47 common frames omitted
Caused by: java.lang.IllegalStateException: Active Scheduler of name 'MyClusterScheduler' already registered in Quartz SchedulerRepository. Cannot create a new Spring-managed Scheduler of the same name!
	at org.springframework.scheduling.quartz.SchedulerFactoryBean.createScheduler(SchedulerFactoryBean.java:679)
	at org.springframework.scheduling.quartz.SchedulerFactoryBean.prepareScheduler(SchedulerFactoryBean.java:614)
	at org.springframework.scheduling.quartz.SchedulerFactoryBean.afterPropertiesSet(SchedulerFactoryBean.java:502)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1862)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1799)
	... 58 common frames omitted

排查了很久,以为是配置文属性配置的不对,或者是工程内另外一个类QuartzDemo代码影响的。结果,发现都不是。没办法,就断点debug,查看quartz源码,最终发现了问题出现的根本原因。

根本原因是

工程里面我的quartz的配置文件名为quartz.properties,跟Quartz默认的配置文件名quartz.properties相同。导致工程启动的时候,我本地的quartz配置文件覆盖了系统的配置文件。工程启动时,首先进入QuartzInitializerListener.java,执行了contextInitialized()方法,并实例化了一个Scheduler。随后,进入QuartzConfig.java中执行了 schedulerFactoryBean()方法,并在在执行

propertiesFactoryBean.getObject();后进入SchedulerFactoryBean.java类中,执行了

afterPropertiesSet()
prepareSchedulerFactory()
createScheduler(SchedulerFactory schedulerFactory, @Nullable String schedulerName)

从而再一次实例化了一个相同的Scheduler,导致Scheduler实例化了两次,所以报Error:

评论 10
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值