如何将Quartz Scheduler连接到Spring上下文中?

时间:2014-02-04 15:52:00

标签: java spring quartz-scheduler

我有一个应用程序,我想在其中使用Quartz Scheduler对象。我已阅读有关此问题的Spring文档,他们建议使用SchedulerFactoryBean这样的内容:

<bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="autoStartup">
        <value>true</value>
    </property>
    <property name="configLocation" value="classpath:quartz.properties" />
</bean>

配置如下所示:

org.quartz.scheduler.skipUpdateCheck = true
org.quartz.scheduler.instanceName = MyQuartzScheduler
org.quartz.scheduler.jobFactory.class = org.quartz.simpl.SimpleJobFactory
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 5
log4j.rootLogger=INFO, stdout
log4j.logger.org.quartz=DEBUG
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n

现在,如果我想将schedulerFactoryBean注入我的一个对象中,我会得到一个例外说明:

Could not convert constructor argument value of type [org.quartz.impl.StdScheduler] to required type [org.springframework.scheduling.quartz.SchedulerFactoryBean]:

为什么我会获得StdScheduler而不是schedulerFactoryBean?我错过了配置步骤吗?

2 个答案:

答案 0 :(得分:17)

SchedulerFactoryBeanFactoryBean所以它是can't be used like a normal bean。当你将它注入其他bean时,Spring将注入工厂生成的org.quartz.Scheduler对象,它不会自己注入工厂。

通常将工厂bean命名为它生成的对象,因为它在引用它时读取效果更好。例如:

<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="autoStartup">
        <value>true</value>
    </property>
    <property name="configLocation" value="classpath:quartz.properties" />
</bean>

然后你可以像这样配置一个需要Scheduler的对象:

<bean id="beanThatNeedsScheduler" class="beanThatNeedsScheduler">
    <!-- Will inject a Scheduler not a SchdulerFactoryBean -->
    <property name="scheduler" ref="scheduler" />
</bean>

或使用注释:

@Component
public class BeanThatNeedsScheduler {

    @Autowired;
    private Scheduler scheduler

    ...
}

答案 1 :(得分:0)

SchedulerFactoryBean将创建和配置org.quartz.Quartz,将其生命周期作为Spring应用程序上下文的一部分进行管理,并将Scheduler公开为依赖注入的bean引用。

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">...</bean>

你可以

@Component
public class YourTask {

@Inject
private Scheduler scheduler

}