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

Ada*_*old 10 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>
Run Code Online (Sandbox Code Playgroud)

配置如下所示:

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
Run Code Online (Sandbox Code Playgroud)

现在,如果我想注入schedulerFactoryBean我的一个对象,我得到一个异常说明:

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

为什么我得到一个StdScheduler而不是一个schedulerFactoryBean?我错过了配置步骤吗?

Wil*_*ing 17

A SchedulerFactoryBeanFactoryBean因为它不能像普通的豆一样使用.当你将它注入其他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>
Run Code Online (Sandbox Code Playgroud)

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

<bean id="beanThatNeedsScheduler" class="beanThatNeedsScheduler">
    <!-- Will inject a Scheduler not a SchdulerFactoryBean -->
    <property name="scheduler" ref="scheduler" />
</bean>
Run Code Online (Sandbox Code Playgroud)

或者使用注释:

@Component
public class BeanThatNeedsScheduler {

    @Autowired;
    private Scheduler scheduler

    ...
}
Run Code Online (Sandbox Code Playgroud)