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
オブジェクトの1つにschedulerFactoryBean
を挿入したい場合、次のような例外が発生します。
Could not convert constructor argument value of type [org.quartz.impl.StdScheduler] to required type [org.springframework.scheduling.quartz.SchedulerFactoryBean]:
StdScheduler
の代わりにschedulerFactoryBean
を取得するのはなぜですか?構成手順を見逃していませんか?
SchedulerFactoryBean
はFactoryBean
なので、 通常の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
...
}
SchedulerFactoryBeanは、org.quartz.Quartzを作成および構成し、Springアプリケーションコンテキストの一部としてそのライフサイクルを管理し、依存性注入のBean参照としてスケジューラーを公開します。
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">...</bean>
そして、次のことができます
@Component
public class YourTask {
@Inject
private Scheduler scheduler
}