@TargetSE(valueSE=TYPESE) @RetentionSE(valueSE=RUNTIMESE) @Import(value=SchedulingConfiguration.class) @DocumentedSE public @interface EnableScheduling
<task:*>
XML 名前空間にある機能と同様に、Spring のスケジュールされたタスク実行機能を有効にします。次のように @Configuration
クラスで使用されます。@Configuration @EnableScheduling public class AppConfig { // various @Bean definitions }
これにより、コンテナー内の Spring 管理の Bean で @Scheduled
アノテーションを検出できます。例: クラス MyTask
が与えられた:
package com.myco.tasks; public class MyTask { @Scheduled(fixedRate=1000) public void work() { // task execution logic } }
次の構成では、MyTask.work()
が 1000 ミリ秒ごとに 1 回呼び出されるようにします。
@Configuration @EnableScheduling public class AppConfig { @Bean public MyTask task() { return new MyTask(); } }
あるいは、MyTask
に @Component
アノテーションが付けられている場合、次の構成により、その @Scheduled
メソッドが必要な間隔で呼び出されるようになります。
@Configuration @EnableScheduling @ComponentScan(basePackages="com.myco.tasks") public class AppConfig { }
@Scheduled
アノテーションが付けられたメソッドは、@Configuration
クラス内で直接宣言することもできます。
@Configuration @EnableScheduling public class AppConfig { @Scheduled(fixedRate=1000) public void work() { // task execution logic } }
デフォルトでは、Spring は、コンテキスト内の一意の TaskScheduler
Bean、またはそれ以外の場合は "taskScheduler" という名前の TaskScheduler
Bean のいずれかの関連するスケジューラ定義を検索します。ScheduledExecutorService
SE Bean についても同じ検索が実行されます。どちらも解決できない場合は、ローカルのシングルスレッドのデフォルトスケジューラが作成され、レジストラ内で使用されます。
より詳細な制御が必要な場合、@Configuration
クラスは SchedulingConfigurer
を実装できます。これにより、基になる ScheduledTaskRegistrar
インスタンスにアクセスできます。例: 次の例は、スケジュールされたタスクの実行に使用される Executor
SE をカスタマイズする方法を示しています。
@Configuration @EnableScheduling public class AppConfig implements SchedulingConfigurer { @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { taskRegistrar.setScheduler(taskExecutor()); } @Bean(destroyMethod="shutdown") public Executor taskExecutor() { return Executors.newScheduledThreadPool(100); } }
上記の例では、@Bean(destroyMethod="shutdown")
の使用に注意してください。これにより、Spring アプリケーションコンテキスト自体が閉じられたときにタスクエグゼキュータが適切にシャットダウンされます。
SchedulingConfigurer
を実装すると、ScheduledTaskRegistrar
を介してタスク登録をきめ細かく制御することもできます。例: 以下は、カスタム Trigger
実装ごとに特定の Bean メソッドの実行を構成します。
@Configuration @EnableScheduling public class AppConfig implements SchedulingConfigurer { @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { taskRegistrar.setScheduler(taskScheduler()); taskRegistrar.addTriggerTask( () -> myTask().work(), new CustomTrigger() ); } @Bean(destroyMethod="shutdown") public Executor taskScheduler() { return Executors.newScheduledThreadPool(42); } @Bean public MyTask myTask() { return new MyTask(); } }
参考のために、上記の例を次の Spring XML 構成と比較できます。
<beans> <task:annotation-driven scheduler="taskScheduler"/> <task:scheduler id="taskScheduler" pool-size="42"/> <task:scheduled-tasks scheduler="taskScheduler"> <task:scheduled ref="myTask" method="work" fixed-rate="1000"/> </task:scheduled-tasks> <bean id="myTask" class="com.foo.MyTask"/> </beans>
これらの例は、XML ではカスタム Trigger
実装の代わりに固定レート期間が使用されることを除いて、同等です。これは、task:
名前空間 scheduled
がそのようなサポートを簡単に公開できないためです。これは、コードベースのアプローチが実際のコンポーネントに直接アクセスすることで最大限の構成可能性を可能にする方法の 1 つにすぎません。
注: @EnableScheduling
はローカルアプリケーションコンテキストにのみ適用され、異なるレベルでの Bean の選択的なスケジューリングを可能にします。複数のレベルで動作を適用する必要がある場合は、@EnableScheduling
を個々のコンテキスト(たとえば、共通ルート Web アプリケーションコンテキストや個別の DispatcherServlet
アプリケーションコンテキスト)で再宣言してください。
Scheduled
, SchedulingConfiguration
, SchedulingConfigurer
, ScheduledTaskRegistrar
, Trigger
, ScheduledAnnotationBeanPostProcessor