後台開發常面臨定時數據清理、報表生成、業務邏輯排程等需求。Java 提供了從基礎 API 到企業級框架的多種實現路徑,選型關鍵在於並發性能、彈性配置、運維便利性三大維度。
最原始寫法,缺乏啟停控制、異常處理、執行時間精確控制,且單線程阻塞風險高。
基於線程池,解決 Timer 所有痛點:
initialDelay、period、TimeUnit。scheduleAtFixedRate(固定頻率)與 scheduleWithFixedDelay(固定延遲)兩種語義。ScheduledExecutorService executor = Executors.newScheduledThreadPool(2);
executor.scheduleAtFixedRate(task, 0, 5, TimeUnit.SECONDS);
Spring 3.0+ 內建,無額外依賴,支持 Cron 表達式、固定頻率、固定延遲。
@EnableScheduling
@Configuration
public class TaskConfig { }
@Component
public class MyTask {
@Scheduled(cron = "0 0 2 * * ?") // 每天凌晨 2 點
public void execute() { ... }
}
優點:開箱即用、注解驅動、輕量。缺點:單機模式、無持久化、重啟丟失狀態、不支持動態修改。
專業調度框架,支持集群、持久化、監聽器、多種觸發器。
SimpleTrigger:固定間隔。CronTrigger:Cron 表達式(如 0 0 12 * * ? 每天中午)。Spring 整合需配置 SchedulerFactoryBean、JobDetail、Trigger,XML 配置較繁瑣,適合分布式、高可靠性場景。
早期 Spring 方案,只能指定頻率不能指定具體時間,已被上述方案取代。
| 場景 | 推薦方案 |
|---|---|
| 簡單單機、固定頻率、無狀態 | @Scheduled (Spring Task) |
| 需動態增刪改任務、Web 管理界面 | Quartz + 動態任務管理模塊 |
| 分布式集群、高可用、任務不重複執行 | Quartz 集群模式 / XXL-JOB / PowerJob |
| 輕量級微服務、無額外依賴 | ScheduledExecutorService 手動管理 |
現代架構建議引入 XXL-JOB 或 PowerJob 等分布式調度平台,將調度與業務解耦,獲得可視化運維、分片廣播、故障轉移等企業級能力。