Spring BootのScheduledでは、TimeUnitを設定できる

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

以前、Spring BootではScheduledを使うことで定期実行ができることを説明しましたが、今回は更に便利に使う方法について紹介します。

Spring BootのScheduled

以前、以下の記事でSpring BootのScheduledについて説明しました。

tech.excite.co.jp

この記事では cron を指定する方法のみ説明していますが、実は他にも指定方法があります。

それは、 fixedDelayfixedRate です。

fixedDelay を指定すると、「前回の実行が終了してから指定時間が経ったら、また実行を開始する」という方法で処理を行うことが出来ます。

// 1000ms間隔
@Scheduled(fixedDelay = 1000)
public void sample() {
    // 処理
}

fixedRate の場合、「前回の実行が開始してから指定時間が経ったら、また実行を開始する」という指定方法になります。

// 1000ms間隔
@Scheduled(fixedRate = 1000)
public void sample() {
    // 処理
}

どちらも cron では微妙に手が届かなかったことができるようになります。

特に fixedDelay は、Spring Boot側で終了を待ってから間隔の計測を始めてくれるので、かなり重宝するのではないでしょうか。

ただしこちら、少し扱いづらい部分があります。

コードサンプルのコメントでも書きましたが、デフォルトだと間隔指定がミリ秒単位となっているのです。

このままでは、例えば分単位・時間単位の間隔で実行したい場合に、かなり分かりづらくなってしまいます。

ScheduledとTimeUnit

ですが幸い、Scheduledではそれを解消できる手が用意されています。

それは TimeUnit です。

以下のように指定すれば、ミリ秒以外の単位で間隔を指定できるようになります。

// 1秒間隔
@Scheduled(timeUnit = TimeUnit.SECONDS, fixedDelay = 1)
public void sampleForSeconds() {
    // 処理
}

// 1分間隔
@Scheduled(timeUnit = TimeUnit.MINUTES, fixedDelay = 1)
public void sampleForMinutes() {
    // 処理
}

これ以外にも、時間単位等でも指定できます。

ミリ秒だけで指定するのに比べて、相当分かりやすくなっていると言って良いでしょう。

最後に

Scheduledは fixedDelayTimeUnit が存在することで、単に「サーバの cron の代わりにアプリケーションコード上に定期実行間隔を書くことができる」という以上に使いやすいものになっていると思います。

是非一度、使ってみることをおすすめします。