きり丸の技術日記

技術検証したり、資格等をここに残していきます。

Spring Scheduledで定期実行する

きり丸アドベントカレンダー2020の22記事目です。


バッチ処理等の定期的な実行を行うには、cronがあります。製品としては日立製作所のJP1、ソフトバンクLoadstar Scheduler等があります。

Spring Bootの機能でも、定期実行できるSpring Scheduledが存在します。

この記事ではSpring Scheduledを使用して、定期実行させます。

ゴール

  • Spring Scheduledで定期実行する

環境

  • Java
    • 15
  • org.springframework.boot:spring-boot-starter-web
    • 2.4.0
  • Lombok

手順

Spring Scheduledを有効にする


@SpringBootApplicationを付与しているファイルに対して、@EnableSchedulingを付与します。

@SpringBootApplication
@EnableCaching
@EnableScheduling
public class DemoApplication {

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

}

定期実行の設定する


@Scheduledを定期実行したいメソッドに付与します。アノテーションにいくつか定期実行用の設定があります。Developers.IO様の記事がそのまま役に立ちますので引用させていただきます。

Developers.IO様の記事引用。

句・引数 説明
fixedDelay メソッドの前回の実行完了時刻から何ミリ秒後に実行するか。
fixedRate メソッドの前回の実行開始時刻から何ミリ秒後に実行するか。
initialDelay メソッドの初回実行時の待機時間。
cron cronを記述してスケジュールを設定。zoneを使用して時間帯の指定も可能。

ファイル名:BusinessDateComponentImpl.java

  @Scheduled(fixedDelay = 30000) // 最後に実行してからNミリ秒
  @CacheEvict("businessDate")
  @Override
  public void deleteCache() {
  }

ソースコード

アドベントカレンダー22日目。
github.com

終わりに

ヘルスチェック等々もありますので、アプリケーション内部に定期実行の設定を持たせるのではなく、サーバ側に定期実行の設定を持たせた方が無難です。

しかし、前回の記事のように情報にキャッシュを使用しており、キャッシュをクリアする場合は、アプリケーション内部に持たせた定期実行を使用したほうがよいです。

というのも、実際に運用する際にはロードバランサーがいたり、Kubernates等々を使用していることでしょう。その場合、LB経由した外側からキャッシュクリアの命令を行っても、全てのアプリケーションサーバのキャッシュがクリアされたかどうかは分かりません。実際、Kubernates運用時に、一部Podのキャッシュがクリアできていなかったということが発生しました。

キャッシュを使用しつつ、定期的にキャッシュ削除する、というのが非常に珍しいユースケースではありますが…。

他にも、このケースは有効だという例があれば教えていただけると助かります。


この記事がお役に立ちましたら、各種SNSでのシェアや、今後も情報発信しますのでフォローよろしくお願いします。

参考記事

敬称略

Developers.IO:[Spring Boot][Java] アノテーション@Scheduledを使用してタスクを定期実行する

※設定ファイルはうまく設定できませんでした。 dev.classmethod.jp

類似記事

きり丸アドベントカレンダー2020 adventar.org

きり丸のHerokuページ
https://kirimaru-todoapp.herokuapp.com/

23日目のアドベントカレンダーの記事 https://nainaistar.hatenablog.com/entry/2020/12/23/083000nainaistar.hatenablog.com

f:id:nainaistar:20201109133010p:plain