きり丸アドベントカレンダー2020の22記事目です。
バッチ処理等の定期的な実行を行うには、cronがあります。製品としては日立製作所のJP1、ソフトバンクのLoadstar Scheduler等があります。
Spring Bootの機能でも、定期実行できるSpring Scheduledが存在します。
この記事ではSpring Scheduledを使用して、定期実行させます。
ゴール
- Spring Scheduledで定期実行する
環境
手順
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