首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Web 開發定時任務選型:Quartz vs Spring Task vs JDK Timer 完整比較

     編輯:程式設計綜合問答

需求場景

  1. **每日固定時間** 產生靜態 HTML (50~100 檔),需查詢資料庫。
  2. **每半個月** 批次更新資料庫標記廢棄資料 (~500 筆),執行單一 SQL。

方案比較表

維度JDK TimerSpring @ScheduledQuartz
依賴零 (JDK 內建)Spring Context獨立庫 / Spring 整合
叢集/高可用❌ 無❌ 單節點 (需配合 ShedLock)✅ 內建 JDBC JobStore 叢集
持久化/重啟不丟失❌ 記憶體內❌ 記憶體內✅ 資料庫持久化
Cron 表達式支援❌ 僅固定延遲/週期✅ @Scheduled(cron="...")✅ 原生 CronTrigger
動態新增/移除任務困難困難 (需重啟或反射)✅ API 動態管理
監控/管理介面無無 (需 Actuator)豐富 (Quartz Manager, Admin UI)
適用場景簡單單機、臨時任務Spring 專案、固定排程、非關鍵生產環境、叢集、需持久化/動態管理

推薦選型

  • **專案已使用 Spring Boot** → **首選 Spring `@Scheduled`** (簡單、零額外依賴),滿足「每日固定時間」「每半個月」皆為標準 Cron 表達式。
  • **需叢集部署、任務不可丟失、動態管理** → **整合 Quartz** (Spring Boot Starter: `spring-boot-starter-quartz`),使用 `JDBC JobStore` 持久化至資料庫。
  • **無 Spring、極簡單機** → `Timer` 或 `ScheduledExecutorService` 足矣。

Spring @Scheduled 實作範例

@Configuration @EnableScheduling
public class TaskConfig {}

@Component
public class HtmlGenerateTask {
    @Autowired HtmlService htmlService;

    // 每天凌晨 02:00
    @Scheduled(cron = "0 0 2 * * ?")
    public void generateDailyHtml() {
        List list = htmlService.queryData();
        list.forEach(htmlService::generateStaticHtml);
    }
}

@Component
public class DataCleanupTask {
    @Autowired JdbcTemplate jdbc;

    // 每月 1 號、16 號 03:00
    @Scheduled(cron = "0 0 3 1,16 * ?")
    public void markObsolete() {
        jdbc.update("UPDATE biz_data SET status='OBSOLETE' WHERE create_time < DATE_SUB(NOW(), INTERVAL 15 DAY) AND status='ACTIVE'");
    }
}

Quartz 整合要點 (Spring Boot)

# application.yml
spring:
  quartz:
    job-store-type: jdbc
    jdbc:
      initialize-schema: always
    properties:
      org.quartz.scheduler.instanceName: MyScheduler
      org.quartz.scheduler.instanceId: AUTO
      org.quartz.jobStore.class: org.quartz.impl.jdbcjobstore.JobStoreTX
      org.quartz.jobStore.driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
      org.quartz.jobStore.tablePrefix: QRTZ_
      org.quartz.jobStore.isClustered: true
      org.quartz.jobStore.clusterCheckinInterval: 15000

實作 `Job` 介面,透過 `SchedulerFactoryBean` 註冊 `JobDetail` + `CronTrigger`,即可獲得企業級排程能力。

總結

**Spring Boot 專案 → `@Scheduled` 起步,若未來需叢集/持久化/動態管理 → 平滑遷移至 Quartz** (Spring 整合無縫)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved