[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); } ... } }