Spring @Scheduledのcron書き方 — 6フィールド(秒あり)とzone指定
Spring Frameworkの @Scheduled(cron="...") は【6フィールド(秒 分 時 日 月 曜日)】で、標準cronの式の先頭に「秒」を足した形です。Linuxのcron式をそのままコピペすると起動時エラーになります。
書式の要点(標準cronとの違い)
- フィールドは6つ: 秒 分 時 日 月 曜日(年フィールドはありません)。
- zone属性でタイムゾーンを指定できます: @Scheduled(cron="...", zone="Asia/Tokyo")。未指定はサーバーのデフォルトタイムゾーン。
- @daily・@hourly などのマクロが使えます(Spring 5.3+)。
- 曜日は0または7が日曜。MON-FRIの英字表記も可。
日本時間(JST)で指定するには
zone="Asia/Tokyo" を付ければ、サーバーがUTCでも日本時間のまま書けます。コンテナ環境はUTCが多いため、zoneを明示する習慣にしておくと事故を防げます。
コピペで使える設定例
平日9時(日本時間指定・秒フィールドに注意)
@Scheduled(cron = "0 0 9 * * MON-FRI", zone = "Asia/Tokyo")
public void weekdayReport() {
// 処理
}毎時0分に実行
@Scheduled(cron = "0 0 * * * *", zone = "Asia/Tokyo")つまずきポイント
- 5フィールドの式を貼ると『Cron expression must consist of 6 fields』エラー。先頭に秒(通常は0)を足します。
- アプリを複数インスタンスで動かすと全インスタンスで実行されます。多重実行を防ぐにはShedLock等の分散ロックが必要です。
- @EnableScheduling を付け忘れると何も起きません。
式を検証する(標準cron形式)
下のツールで式の意味と次回実行時刻を確認できます。サーバーのタイムゾーンに合わせて切り替えられます。
ドロップダウンで組み立てる(クリックだけでcron式を作成)
各項目を選ぶと、上の式が自動で更新されます。「毎」のままの項目は現在の式を維持します。
次に実行される時刻
※ 時刻はお使いの端末のローカルタイムで計算しています。