Quartz 是企業級任務調度框架標準,Spring 通過 spring-context-support 模組對其進行了深度封裝與簡化。本文演示基於 XML 配置的 Spring 整合 Quartz 全流程,涵蓋 Job 定義、觸發器配置、Cron 表達式詳解與啟動驗證。
package com.kay.quartz;
public class QuartzJob {
public void work() {
System.out.println("Quartz 任務調度執行:" + new java.util.Date());
// 實際業務:發送報表、清理臨時文件、同步數據等
}
}
package com.kay.quartz;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainTest {
public static void main(String[] args) {
System.out.println("Test start.");
ApplicationContext ctx = new ClassPathXmlApplicationContext("quartz-config.xml");
// lazy-init="false" 時無需手動 getBean 即可啟動
System.out.println("Test end. Scheduler running in background...");
// 防止主線程結束導致 JVM 退出(測試用)
try { Thread.sleep(60000); } catch (InterruptedException ignored) {}
}
}
格式:秒 分 時 日 月 周 [年](7 個域,年可選)
| 域 | 允許值 | 特殊字符 |
|---|---|---|
| 秒 | 0-59 | , - * / |
| 分 | 0-59 | , - * / |
| 時 | 0-23 | , - * / |
| 日 | 1-31 | , - * ? / L W C |
| 月 | 1-12 / JAN-DEC | , - * / |
| 周 | 1-7 / SUN-SAT | , - * ? / L C # |
| 年(可選) | empty, 1970-2099 | , - * / |
*:所有值?:無具體值(僅日/周域互斥使用)-:範圍,如 10-12,:枚舉,如 MON,WED,FRI/:增量,如 0/15 表示從 0 開始每 15 分鐘L:Last,日域=月末最後一天,周域=最後一個周X(如 6L=最後一個週五)W:最近工作日,如 15W=離 15 號最近的工作日#:第 N 個周X,如 6#3=第 3 個週五0 0 12 * * ? 每天中午 12:00
0 15 10 ? * * 每天 10:15
0 0/5 14 * * ? 每天 14:00-14:55 每 5 分鐘
0 0/5 14,18 * * ? 每天 14:00-14:55 和 18:00-18:55 每 5 分鐘
0 15 10 ? * MON-FRI 工作日 10:15
0 15 10 15 * ? 每月 15 號 10:15
0 15 10 L * ? 每月最後一天 10:15
0 15 10 ? * 6L 每月最後一個週五 10:15
0 15 10 ? * 6#3 每月第三個週五 10:15
0 6 * * * 每天 06:00
0 */2 * * * 每 2 小時
dataSource + JobStoreTX,任務狀態存入數據庫,支援集群與重啟恢復。org.quartz.jobStore.isClustered=true,多節點自動負載均衡與故障轉移。org.quartz.threadPool.threadCount 根據並發任務數設置(默認 10)。misfireInstruction 定義錯過觸發時的補償行為(如立即執行、放棄、下次執行)。Spring + Quartz 組合提供了開箱即用的聲明式調度能力,配合 Cron 表達式的靈活性,能滿足 90% 以上的定時任務場景。生產環境建議啟用持久化與集群模式,確保高可用與數據一致性。