アノテーションインターフェース 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 についても同じ検索が実行されます。どちらも解決できない場合は、ローカルのシングルスレッドのデフォルトスケジューラが作成され、レジストラ内で使用されます。

より詳細な制御が必要な場合、@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 を選択的にスケジュールできます。複数のレベルでその動作を適用する必要がある場合は、共通のルート Web アプリケーションコンテキストと個別の DispatcherServlet アプリケーションコンテキストなど、各コンテキストで @EnableScheduling を再宣言してください。

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