Quartz Cron の形式
Quartz の式は 6 つまたは 7 つのフィールドを持ちます。秒、分、時、日、月、曜日、そして任意の年です。たとえば 0 0 12 ? * MON-FRI は平日の正午に実行されます。曜日は 1(日曜日)〜 7(土曜日)で表し、MON や FRI といった略称も範囲指定を含めて使えます。
疑問符のルール
Quartz では日と曜日を同時に指定できません。2 つのフィールドのうちちょうど一方に「特定の値なし」を意味する「?」を入れる必要があります。そのため 0 0 12 * * MON は無効で、0 0 12 ? * MON と書きます。解説ツールはこの誤りをすぐに指摘します。
特殊文字 L・W・#
L は「最後」を意味します。日フィールドの L は月末日、L-3 は月末の 3 日前、曜日フィールドの 6L はその月の最後の金曜日です。W は月をまたがずに指定日に最も近い平日を表し、15W は 15 日に最も近い平日、LW は月の最終平日です。シャープは第 n 曜日を選び、6#3 は第 3 金曜日です。
Quartz の実践
Java コードでは、Quartz の式はトリガーに設定します。例: TriggerBuilder.newTrigger().withSchedule(CronScheduleBuilder.cronSchedule("0 0 12 ? * MON-FRI").inTimeZone(TimeZone.getTimeZone("Asia/Tokyo")))。inTimeZone を指定しないと JVM のデフォルトタイムゾーンが使われます。ミスファイア設定は、予定時刻にスケジューラーが停止していた場合の動作(すぐに 1 回実行するか、次の時刻まで飛ばすか)を決めます。
よくある質問
- Quartz Cron と Unix Cron の違いは?
- Quartz は先頭に秒、末尾に任意の年を追加し、曜日を 1 = 日曜日から数え、日か曜日の一方に「?」を必須とし、L・W・# に対応しています。
- Quartz の式を crontab に変換できますか?
- 秒が 0 で、年が指定されておらず、L・W・# を使っていなければ可能です。変換ツールが crontab の等価な式を表示するか、変換できない理由を説明します。
- 0 0/5 * * * ? はどういう意味ですか?
- 毎日、毎時 0 分から 5 分ごとに、0 秒の時点で実行されます。
- Spring の @Scheduled の Cron は Quartz と同じですか?
- よく似ていますが、Spring は日曜日を 0 または 7 で表し、年フィールドがなく、「?」も必須ではありません。Spring の式は Spring のページをご利用ください。