Spring Bootでは、Scheduledを使うことでバッチの定期実行ができる

こんにちは。 エキサイト株式会社の三浦です。

突然ですが、バッチを定期実行させたい時、皆さんはどうしますか?

有名なところではサーバの 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() {
        // ...
    }
}

非常にシンプルに、アプリケーションコード内に定期実行設定が出来ました。

また、 Scheduledcron 同様、日時指定以外にも一定間隔ごとの実行などを指定することが出来ます。

最後に

定期実行設定は、アプリケーションコード内に記述することでかなり可読性がアップします。

Spring Bootを使っているなら、ぜひ使ってみることをおすすめします。