[Spring][Quartz] Quartz の Job から Spring の ApplicationContext にアクセスする

Spring には Quartz の統合が含まれており、簡単に Quartz のスケジューラが使えるようになっている。Spring 上で Quartz を動かすと、当然ジョブから ApplicationContext で定義したサービスを利用したいケースがでてくる。

Spring で Quartz を使うには SchedulerFactoryBean を利用するが、SchedulerFactoryBean には applicationContextSchedulerContextKey というプロパティが用意されており、これを設定すると指定されたキーで SchedulerContext に ApplicationContext が登録される。

  <bean id="scheduler"
        class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="applicationContextSchedulerContextKey">
      <value>applicationContext</value>
    </property>
  </bean>

こうしておくことで、「applicationContext」という名前で ApplicationContext が登録されるので、Job のほうから以下のようにして参照することができる。

public class FooJob implements Job {

    private static final String APPLICATION_CONTEXT_KEY = "applicationContext";

    @Override
    public void execute(JobExecutionContext context)
            throws JobExecutionException {

        ApplicationContext applicationContext;
        try {
            applicationContext = (ApplicationContext)context.getScheduler().getContext().get(APPLICATION_CONTEXT_KEY);
        } catch (SchedulerException e) {
            throw new JobExecutionException("ApplicationContext の取得に失敗しました。", e);
        }
        ...
    }

}