我有一个应用程序,我想在其中使用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
?我错过了配置步骤吗?
答案 0 :(得分:17)
SchedulerFactoryBean
是FactoryBean
所以它是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
}