web-dev-qa-db-ja.com

QuartzスケジューラをSpringコンテキストに接続するにはどうすればよいですか?

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を取得するのはなぜですか?構成手順を見逃していませんか?

10
Adam Arold

SchedulerFactoryBeanFactoryBeanなので、 通常の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

    ...
}
17
Will Keeling

SchedulerFactoryBeanは、org.quartz.Quartzを作成および構成し、Springアプリケーションコンテキストの一部としてそのライフサイクルを管理し、依存性注入のBean参照としてスケジューラーを公開します。

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

そして、次のことができます

@Component
public class YourTask {

@Inject
private Scheduler scheduler

}
1
bearlee