Springタスクスケジューラの手引き

1.概要

この記事では、 Springタスク・スケジューリング・メカニズム - TaskScheduler について説明します。これは、構築済みの実装と、さまざまなトリガーを使用するためのものです。 Springでのスケジュールの詳細について知りたい場合は、 @Async および @Scheduled の記事を確認してください。

TaskScheuler は、Spring 3.0で将来のある時点で実行するためのさまざまなメソッドと共に導入されました。また、 ScheduledFuture インターフェースの表現オブジェクトも返します。

実行する必要のあるタスクをスケジューリング用に選択してから適切なスケジューリングポリシーを選択するだけです。

2. ThreadPoolTask​​Scheduler

ThreadPoolTask​​Scheduler ScheduledExecutorService にタスクを委任し、 TaskExecutor インターフェースを実装しているため、内部スレッド管理に適しています。そのため、単一インスタンスで @ Scheduled アノテーションと同様に非同期の潜在的な実行を処理できます。

ThreadPoolTask​​SchedulerConfig ThreadPoolTask​​Scheduler Beanを定義しましょう:

@Configuration
@ComponentScan(
  basePackages="org.baeldung.taskscheduler",
  basePackageClasses={ThreadPoolTaskSchedulerExamples.class})
public class ThreadPoolTaskSchedulerConfig {

    @Bean
    public ThreadPoolTaskScheduler threadPoolTaskScheduler(){
        ThreadPoolTaskScheduler threadPoolTaskScheduler
          = new ThreadPoolTaskScheduler();
        threadPoolTaskScheduler.setPoolSize(5);
        threadPoolTaskScheduler.setThreadNamePrefix(
          "ThreadPoolTaskScheduler");
        return threadPoolTaskScheduler;
    }
}

構成されたBean threadPoolTask​​Scheduler は、構成されたプールサイズ5に基づいてタスクを非同期に実行できます。

ThreadPoolTask​​Scheduler に関連するすべてのスレッド名の先頭には ThreadPoolTask​​Scheduler が付きます。

次にスケジュールできる簡単なタスクを実装しましょう。

class RunnableTask implements Runnable{
    private String message;

    public RunnableTask(String message){
        this.message = message;
    }

    @Override
    public void run() {
        System.out.println(new Date()+" Runnable Task with "+message
          +" on thread "+Thread.currentThread().getName());
    }
}

スケジューラによって実行されるようにこのタスクを簡単にスケジュールすることができます。

taskScheduler.schedule(
  new Runnabletask("Specific time, 3 Seconds from now"),
  new Date(System.currentTimeMillis + 3000)
);

taskScheduler は、この実行可能なタスクを既知の日付、現在の時刻からちょうど3秒後にスケジュールします。

ThreadPoolTask​​Scheduler スケジューリングメカニズムについてもう少し詳しく説明しましょう。

3.固定遅延で Runnable タスクをスケジュールする

固定遅延を使用したスケジューリングは、2つの単純なメカニズムで実行できます。

3.1. 最後にスケジュールされた実行の固定遅延後のスケジューリング

1000ミリ秒の固定遅延の後に実行するタスクを設定しましょう。

taskScheduler.scheduleWithFixedDelay(
  new RunnableTask("Fixed 1 second Delay"), 1000);

RunnableTask は、1回の実行が完了してから次の実行が開始されるまでの1000ミリ秒後に必ず実行されます。

3.2. 特定の日付の固定遅延後のスケジューリング

与えられた開始時間の一定の遅延の後に実行するようにタスクを設定しましょう:

taskScheduler.scheduleWithFixedDelay(
  new RunnableTask("Current Date Fixed 1 second Delay"),
  new Date(),
  1000);

RunnableTask は、指定された実行時間(主に @ PostConstruct メソッドの開始時間)に呼び出され、その後 1000ミリ秒の遅延が生じます。

4.固定レートでのスケジューリング

実行可能タスクを固定速度でスケジュールするための2つの単純なメカニズムがあります。

4.1. 固定レートでの RunnableTask のスケジューリング

タスクを 固定ミリ秒 で実行するようにスケジュールしましょう。

taskScheduler.scheduleAtFixedRate(
  new RunnableTask("Fixed Rate of 2 seconds") , 2000);

次の RunnableTask は、まだ実行されている可能性がある最後の実行のステータスに関係なく、常に2000ミリ秒後に実行されます。

4.2. 指定日から固定レートで RunnableTask をスケジュールする

taskScheduler.scheduleAtFixedRate(new RunnableTask(
  "Fixed Rate of 2 seconds"), new Date(), 3000);

RunnableTask は現在時刻から3000ミリ秒後に実行されます。

5. CronTrigger を使ったスケジューリング

CronTrigger は、cron式に基づいてタスクをスケジュールするために使用されます。

CronTrigger cronTrigger
  = new CronTrigger("10 **  **  **  **  ?");

提供されたトリガーは、指定されたケイデンスまたはスケジュールに従ってタスクを実行するために使用できます。

taskScheduler.schedule(new RunnableTask("Cron Trigger"), cronTrigger);

この場合、 RunnableTask は毎分10秒に実行されます。

6. PeriodicTrigger を使ったスケジューリング

2000ミリ秒の 固定遅延 でタスクをスケジュールするために PeriodicTrigger を使用しましょう:

PeriodicTrigger periodicTrigger
  = new PeriodicTrigger(2000, TimeUnit.MICROSECONDS);

構成された PeriodicTrigger Beanは 2000ミリ秒の固定遅延の後にタスクを実行するために使用されます。

それでは、 PeriodicTrigger を使用して RunnableTask をスケジュールしましょう。

taskScheduler.schedule(
  new RunnableTask("Periodic Trigger"), periodicTrigger);

PeriodicTrigger を固定遅延ではなく固定レートで初期化するように設定することもできます。また、最初のスケジュールタスクの初期遅延を指定のミリ秒で設定することもできます。

必要なのは、 periodicTrigger Beanのreturnステートメントの前に2行のコードを追加することだけです。 :

periodicTrigger.setFixedRate(true);
periodicTrigger.setInitialDelay(1000);

setFixedRate メソッドを使用してタスクを固定遅延ではなく固定レートでスケジュールし、 setInitialDelay メソッドを使用して、実行する最初の実行可能タスクに対してのみ初期遅延を設定します。

7.まとめ

このクイック記事では、Springのタスクサポートを使用して実行可能なタスクをスケジュールする方法を説明しました。

タスクを一定の遅延で、一定のレートで、指定されたトリガーに従って実行することを検討しました。

そして、いつものように、このコードはMavenプロジェクトhttps://github.com/eugenp/tutorials/tree/master/spring-all/src/main/java/org/baeldung/taskscheduler[Githubでの使用]として入手可能です。