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 无关。