コンテナでSpring BootのScheduledを使う際は、initialDelayを設定するのが良い

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

Spring Bootには Scheduled というアノテーションがあり、これを使うと定期実行をしてくれるようになります。

今回は、コンテナでこの Scheduled を使うのであれば initialDelay を設定するのが適切だと思った、という話をしていきます。

Scheduledとは

Scheduled は、Spring Bootで定期実行を制御してくれるアノテーションです。

以下のように使用します。

@Scheduled(timeUnit = TimeUnit.MINUTES, fixedDelay = 1)
public void sample()
    // 定期実行したい処理
}

この処理では、「前回の実行終了の1分後に実行する」を繰り返してくれるようになります。

一件問題なさそうですが、コンテナでやるとなると一つ問題が出てきます。

コンテナでScheduledをやる場合は、initialDelayを使うのが良い

コンテナは、サーバに比べて頻繁に終了・起動が起きることを前提としています。

そしてそれは、「起動が失敗する」状況の絶対数がサーバに比べて多くなる可能性を意味しています。

つまり、コンテナでは「コンテナが安定稼働し始めた」ことがわかってから処理を始めるのがより安全ということです。

ですが上記の処理だと、Spring Bootが起動したらすぐ処理が発生してしまうため、万が一起動後すぐにコンテナが落ちてしまった場合問題が起きる可能性があります。

これを解決するには、 initialDelay という設定を使うのが良いでしょう。

@Scheduled(timeUnit = TimeUnit.MINUTES, fixedDelay = 1, initialDelay = 1)
public void sample()
    // 定期実行したい処理
}

例えばこのようにすれば、Spring Bootの起動から1分待ってから最初の処理が始まります。

動くアプリケーション次第で時間の調整は必要ですが、ここで適切な時間を待つようにすることで「コンテナが安定稼働した」ことを担保できるのではないでしょうか。

最後に

Scheduled は、アプリケーションコードで定期実行を管理できるため、コンテナ上で定期実行をするのに極めて便利だと言えます。

一方で、コンテナで定期実行をするのであればコンテナ特有の稼働安定性を考える必要もあります。

適切な設定で、安全なコンテナ上定期実行をしていきましょう。