SpringBootで処理を定期的に実行させる方法

技術

はじめに

こんにちは!さいけです。

本記事は、「SpringBootで処理を定期実行させる方法」について紹介します。

SpringBootで処理を定期実行させる方法

@EnableSchedulingアノテーションをつける

まず、アプリケーションクラスに@EnableSchedulingをつけます。

これにより、アプリケーションの定期実行設定が有効になります。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableScheduling
public class TaskApplication {

    public static void main(String[] args) {
        SpringApplication.run(TaskApplication.class, args);
    }
}

@Scheduledアノテーションをつける

定期実行したいメソッドに@Scheduledをつけることにより、指定されたスケジューリングでメソッドが実行されるようになります。

また、定期実行するメソッドはvoid型でなければいけないのに注意です。

@Scheduledアノテーションのスケジューリング指定方法は色々あるので、以下に紹介します。

実行完了からn秒後に実行する

メソッド処理の実行完了からn秒後の実行を指定したい場合は、fixedDelayオプションを使います。

@Component
public class TaskController {

    // メソッド処理の実行完了から5秒後に実行する
    @Scheduled(fixedDelay = 5000)
    public void taskFixedDelay() {
        System.out.println("fixedDelay");
    }
}

実行開始からn秒後に実行する

メソッド処理の実行完了からn秒後の実行を指定したい場合は、fixedRateオプションを使います。

@Component
public class TaskController {

    // メソッド処理の実行開始から5秒後に実行する
    @Scheduled(fixedRate = 5000)
    public void taskFixedRate() {
        System.out.println("fixedRate");
    }
}

アプリケーション起動からn秒後に実行する

アプリケーションの起動からn秒後の実行を指定したい場合は、initialDelayオプションを使います。

@Component
public class TaskController {

   // アプリケーションの起動から1秒後に実行する。(それ以降は実行開始から5秒後に定期実行する)
   @Scheduled(initialDelay = 1000, fixedRate = 5000)
    public void taskInitialDelay() {
        System.out.println("initialDelay");
    }
}

cronでスケジューリングを指定する

cronオプションでもスケジューリングを指定することができます。

@Component
public class TaskController {

    // 毎分0秒時に実行する。
    @Scheduled(cron = "0 * * * * *")
    public void taskCron() {
        System.out.println("cron");
    }
}
設定ファイルからcronスケジューリングを指定する

application.ymlもしくはapplication.propertiesの設定ファイルからcronスケジューリングを指定することもできます。

application.yml

scheduler:
  cron: 0 * * * * *

application.properties

scheduler.cron = 0 * * * * *

実行クラスのcronオプションで設定ファイルの値を指定します。

@Component
public class TaskController {

    // 設定ファイルのスケジューリングを取得し実行する(毎分0秒時に実行する。)
    @Scheduled(cron = "${scheduler.cron}")
    public void taskCronSettingFile() {
        System.out.println("cronSettingFile");
    }
}

タイムゾーンを指定する

タイムゾーンを指定するには、zoneオプションを使います。

@Component
public class TaskController {

    // 毎分0秒時に定期実行する。TimeZoneはAsia/Tokyo。
    @Scheduled(cron = "0 * * * * *", zone = "Asia/Tokyo")
    public void taskCronTimeZone() {
        System.out.println("cronTimeZone");
    }
}

おわりに

今回は「SpringBootで処理を定期実行させる方法」について紹介しました。

メソッドに@Scheduledをつけて、ちょっとオプションを指定するだけで簡単にスケジューリングができるので、是非参考にやってみてください。

備考

The @Scheduled Annotation in Spring | Baeldung
How to use the @Scheduled annotation in Spring, to run tasks after a fixed delay, at a fixed rate or according to a cron expression.

コメント

タイトルとURLをコピーしました