使用 cron4j 插件配置定時任務,照搬 Quartz/Spring 的 0 0 4 * * ? 卻報 InvalidPatternException。根因:cron4j 表達式只有 5/6 段(無秒欄位),順序為 分 時 日 月 周 [年]。本文詳解差異並給出正確配置。
UpdateOrderStatusJob.cron=0 0 4 * * ? # 錯誤:含秒欄位,cron4j 不支援
Exception: it.sauronsoftware.cron4j.InvalidPatternException: invalid pattern: "0 0 4 * * ?"
| 欄位 | Quartz (6/7段) | cron4j (5/6段) |
|---|---|---|
| 1 | 秒 (0-59) | 分 (0-59) |
| 2 | 分 (0-59) | 時 (0-23) |
| 3 | 時 (0-23) | 日 (1-31) |
| 4 | 日 (1-31) | 月 (1-12) |
| 5 | 月 (1-12) | 周 (0-7) (0或7=Sun) |
| 6 | 周 (1-7) | 年 (可選) |
| 7 | 年 (可選) | - |
# cron4j 格式:分 時 日 月 周
UpdateOrderStatusJob.cron=0 4 * * *
0:第 0 分4:第 4 時(凌晨 4 點)* * *:每天、每月、每周// 測試代碼
import it.sauronsoftware.cron4j.SchedulingPattern;
public class TestCron4j {
public static void main(String[] args) {
SchedulingPattern pattern = new SchedulingPattern("0 4 * * *");
System.out.println("Next: " + pattern.next(System.currentTimeMillis()));
// 輸出下一次執行時間戳,驗證是否為明天 04:00
}
}
| 需求 | 表達式 | 說明 |
|---|---|---|
| 每分鐘 | * * * * * | |
| 每小時整點 | 0 * * * * | 分=0 |
| 每天 04:00 | 0 4 * * * | 分=0, 時=4 |
| 工作日 09:30 | 30 9 * * 1-5 | 周一至五 |
| 每月 1 號 00:00 | 0 0 1 * * | 日=1 |
| 每年 1 月 1 號 | 0 0 1 1 * | 月=1, 日=1 |
? 不支援:cron4j 無「日/周衝突」概念,直接用 *。分 時 日 月 周 年,通常 5 段足夠。TimeZone.setDefault()。下次配置 cron4j,默念口訣:「分時日月周,無秒無問號」,一把過。