Spring 在第一个 Quartz 作业执行期间抛出 IllegalStateException
IllegalStateException thrown by Spring during first Quartz job execution
在 Quartz 调度程序中第一个作业的第一次执行期间,Spring 抛出以下异常。请注意,该作业在其执行过程中显式调用了 applicationContext.getBean(...)
。
谁能解释这个异常的原因,也许还有避免它的方法?
Spring 版本:4.1.5.RELEASE
石英版本:2.1.6
提前致谢
2015-07-24 09:20:27,416 ERROR be.citobi.mediquality.schedulers.A4MCubeJob - a4MCubeJob in error
java.lang.IllegalStateException: About-to-be-created singleton instance implicitly appeared through the creation of the factory bean that its bean definition points to
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:374)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1111)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1006)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getSingletonFactoryBeanForTypeCheck(AbstractAutowireCapableBeanFactory.java:860)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getTypeForFactoryBean(AbstractAutowireCapableBeanFactory.java:790)
at org.springframework.beans.factory.support.AbstractBeanFactory.isTypeMatch(AbstractBeanFactory.java:542)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doGetBeanNamesForType(DefaultListableBeanFactory.java:436)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanNamesForType(DefaultListableBeanFactory.java:412)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanNamesForType(DefaultListableBeanFactory.java:398)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:337)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:331)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:968)
at be.citobi.mediquality.schedulers.A4MCubeJob.execute(A4MCubeJob.java:26)
at org.quartz.core.JobRunShell.run(JobRunShell.java:213)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:557)
我不确定我的解决方案是否正确,但这是我将 spring beans 自动装配到我的工作的方式。 SchedulerFactoryBean 创建:
//Note: MySpringBean will be automatically autowired here.
//Another possible approach is to use @Autowired and inject necessary bean one level higher
@Bean
public SchedulerFactoryBean scheduler(MySpringBean mySpringBean) {
SchedulerFactoryBean sfb = new SchedulerFactoryBean();
//default configuration goes here
Map<String, Object> schedulerContext = new HashMap<>();
schedulerContext.put("mySpringBean", mySpringBean);
schedulerContext.setSchedulerContextAsMap(schedulerContext);
return sfb;
}
这里是我的工作代码,假设使用这个 spring bean:
public class MyJob extends QuartzJobBean {
private MySpringBean mySpringBean;
public void setMySpringBean(MySpringBean mySpringBean) {
this.mySpringBean = mySpringBean;
}
@Override
public void executeInternal(JobExecutionContext jobContext) throws JobsExecutionException {
//Job logic with usage of mySpringBean
}
}
在我的应用程序中,Quartz 作业不需要整个应用程序上下文——只需要 3 个 bean,所以我决定自动装配某些 bean,而不是自动装配整个上下文
希望对您有所帮助
我发现了问题所在,在 Spring 配置中,声明了几个实现 FactoryBean 的 bean 而不使用泛型。添加泛型解决了这个问题。
这很可能与 Quartz 无关。
在 Quartz 调度程序中第一个作业的第一次执行期间,Spring 抛出以下异常。请注意,该作业在其执行过程中显式调用了 applicationContext.getBean(...)
。
谁能解释这个异常的原因,也许还有避免它的方法?
Spring 版本:4.1.5.RELEASE 石英版本:2.1.6
提前致谢
2015-07-24 09:20:27,416 ERROR be.citobi.mediquality.schedulers.A4MCubeJob - a4MCubeJob in error
java.lang.IllegalStateException: About-to-be-created singleton instance implicitly appeared through the creation of the factory bean that its bean definition points to
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:374)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1111)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1006)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getSingletonFactoryBeanForTypeCheck(AbstractAutowireCapableBeanFactory.java:860)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getTypeForFactoryBean(AbstractAutowireCapableBeanFactory.java:790)
at org.springframework.beans.factory.support.AbstractBeanFactory.isTypeMatch(AbstractBeanFactory.java:542)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doGetBeanNamesForType(DefaultListableBeanFactory.java:436)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanNamesForType(DefaultListableBeanFactory.java:412)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanNamesForType(DefaultListableBeanFactory.java:398)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:337)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:331)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:968)
at be.citobi.mediquality.schedulers.A4MCubeJob.execute(A4MCubeJob.java:26)
at org.quartz.core.JobRunShell.run(JobRunShell.java:213)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:557)
我不确定我的解决方案是否正确,但这是我将 spring beans 自动装配到我的工作的方式。 SchedulerFactoryBean 创建:
//Note: MySpringBean will be automatically autowired here.
//Another possible approach is to use @Autowired and inject necessary bean one level higher
@Bean
public SchedulerFactoryBean scheduler(MySpringBean mySpringBean) {
SchedulerFactoryBean sfb = new SchedulerFactoryBean();
//default configuration goes here
Map<String, Object> schedulerContext = new HashMap<>();
schedulerContext.put("mySpringBean", mySpringBean);
schedulerContext.setSchedulerContextAsMap(schedulerContext);
return sfb;
}
这里是我的工作代码,假设使用这个 spring bean:
public class MyJob extends QuartzJobBean {
private MySpringBean mySpringBean;
public void setMySpringBean(MySpringBean mySpringBean) {
this.mySpringBean = mySpringBean;
}
@Override
public void executeInternal(JobExecutionContext jobContext) throws JobsExecutionException {
//Job logic with usage of mySpringBean
}
}
在我的应用程序中,Quartz 作业不需要整个应用程序上下文——只需要 3 个 bean,所以我决定自动装配某些 bean,而不是自动装配整个上下文
希望对您有所帮助
我发现了问题所在,在 Spring 配置中,声明了几个实现 FactoryBean 的 bean 而不使用泛型。添加泛型解决了这个问题。
这很可能与 Quartz 无关。