こんにちは。 エキサイト株式会社の三浦です。
突然ですが、バッチを定期実行させたい時、皆さんはどうしますか?
有名なところではサーバの cron
機能だと思いますが、実はSpring Bootでは、アプリケーションコード単体で定期実行させることが出来ます。
今回は、Spring Bootのアプリケーションコード単体で定期実行させる方法を紹介します。
cronを使ったバッチの定期実行
アプリケーションを作る際、一日一回ログを取りたい、一時間に一回サイトのランキングを更新したいなど、定期的にコードを実行したい場合があります。
このように定期実行をさせたい場合、有名な方法としてはサーバの cron
を使うというものがあります。
0 10 * * * /usr/bin/php /var/sample/GetLog.php
例えばこのようにすれば、毎日10:00に指定のPHPコードを実行してくれます。
単純に日時を指定する以外にも、「10分に一回実行する」「指定曜日に実行する」など、 cron
ではいろいろな指定方法があります。
非常に便利な cron
ですが、問題点もあります。
それは、これはサーバに対して設定するものなので、どうしてもアプリケーションコードとは記述が離れてしまうことです。
アプリケーションコードだけ見ても、それがいつ実行されるかわからず、 cron
を見に行く必要が出てきてしまいます。
また、アプリケーションコードとは別々に設定しなくては行けない分、開発やデプロイ時の複雑性も増してしまうでしょう。
Scheduledを使ったバッチの定期実行
実はSpring Bootでは、アプリケーションコード単体で定期実行をさせることが出来ます。
やり方は簡単です。
まず、Spring Bootの実行クラスに EnableScheduling
アノテーションを追加します。
@SpringBootApplication @EnableScheduling public class SampleApplication { public static void main(String[] args) { SpringApplication.run(SampleApplication.class, args); } }
その後、 Scheduled
というアノテーションを使用するだけです。
ただし、このアノテーションが使用できるクラスはDIされているクラスなので、そこだけ注意してください。
@Component public class SampleBatch { @Scheduled(cron = 0 0 10 * * *) // Scheduledの場合は、実行秒数まで指定できる分サーバの cron より設定項目が1つ多い public void getLog() { // ... } }
非常にシンプルに、アプリケーションコード内に定期実行設定が出来ました。
また、 Scheduled
も cron
同様、日時指定以外にも一定間隔ごとの実行などを指定することが出来ます。
最後に
定期実行設定は、アプリケーションコード内に記述することでかなり可読性がアップします。
Spring Bootを使っているなら、ぜひ使ってみることをおすすめします。