@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 のいずれかの関連するスケジューラ定義を検索します。ScheduledExecutorServiceSE Bean についても同じ検索が実行されます。どちらも解決できない場合は、ローカルのシングルスレッドのデフォルトスケジューラが作成され、レジストラ内で使用されます。
より詳細な制御が必要な場合、@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>
これらの例は、XML ではカスタム Trigger 実装の代わりに固定レート期間が使用されることを除いて、同等です。これは、task: 名前空間 scheduled がそのようなサポートを簡単に公開できないためです。これは、コードベースのアプローチが実際のコンポーネントに直接アクセスすることで最大限の構成可能性を可能にする方法の 1 つにすぎません。
注: @EnableScheduling はローカルアプリケーションコンテキストにのみ適用され、異なるレベルでの Bean の選択的なスケジューリングを可能にします。複数のレベルで動作を適用する必要がある場合は、@EnableScheduling を個々のコンテキスト(たとえば、共通ルート Web アプリケーションコンテキストや個別の DispatcherServlet アプリケーションコンテキスト)で再宣言してください。
Scheduled, SchedulingConfiguration, SchedulingConfigurer, ScheduledTaskRegistrar, Trigger, ScheduledAnnotationBeanPostProcessor