アノテーションインターフェース EnableScheduling


Spring の <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 のいずれかです。ScheduledExecutorServiceSE Bean に対しても同じルックアップが実行されます。2 つのどちらも解決できない場合は、ローカルのシングルスレッドのデフォルトスケジューラが作成され、レジストラ内で使用されます。

より詳細な制御が必要な場合、@Configuration クラスは SchedulingConfigurer を実装できます。これにより、基になる ScheduledTaskRegistrar インスタンスにアクセスできます。例: 次の例は、スケジュールされたタスクの実行に使用される ExecutorSE をカスタマイズする方法を示しています。

 @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>
 

これらの例は、カスタム Trigger 実装の代わりに XML で固定レート期間が使用されることを除いて同等です。これは、task: 名前空間 scheduled がそのようなサポートを簡単に公開できないためです。これは、コードベースのアプローチにより、実際のコンポーネントに直接アクセスすることで最大限の構成可能性を実現する方法の 1 つにすぎません。

注: @EnableScheduling はローカルアプリケーションコンテキストにのみ適用され、異なるレベルでの Bean の選択的なスケジューリングを可能にします。複数のレベルで動作を適用する必要がある場合は、@EnableScheduling を個々のコンテキスト(たとえば、共通ルート Web アプリケーションコンテキストや個別の DispatcherServlet アプリケーションコンテキスト)で再宣言してください。

導入:
3.1
作成者:
Chris Beams, Juergen Hoeller
関連事項: