Spring + Quartz 整合架構
Spring 透過 SchedulerFactoryBean 整合 Quartz 調度器,提供聲明式配置定時任務。核心三要素:
| 組件 | Spring Bean | 職責 |
| Job | JobDetailBean | 定義任務邏輯類與參數 |
| Trigger | SimpleTriggerBean / CronTriggerBean | 定義觸發時間規則 |
| Scheduler | SchedulerFactoryBean | 管理調度器生命週期,綁定 Trigger |
完整 XML 配置範例
任務執行類實現
package com.example.schedule;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 數據同步定時任務
* 繼承 QuartzJobBean 可直接獲取 JobDataMap 參數
*/
public class DataSyncJob extends QuartzJobBean {
private static final Logger logger = LoggerFactory.getLogger(DataSyncJob.class);
// JobDataMap 自動注入屬性
private int batchSize;
private int retryCount;
public void setBatchSize(int batchSize) { this.batchSize = batchSize; }
public void setRetryCount(int retryCount) { this.retryCount = retryCount; }
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
logger.info("開始執行數據同步任務 - batchSize: {}, retryCount: {}", batchSize, retryCount);
try {
// 業務邏輯:同步外部數據、生成報表、清理過期數據等
syncExternalData();
generateDailyReport();
cleanupExpiredData();
logger.info("數據同步任務執行完成");
} catch (Exception e) {
logger.error("數據同步任務執行失敗", e);
throw new JobExecutionException(e);
}
}
private void syncExternalData() { /* 實現邏輯 */ }
private void generateDailyReport() { /* 實現邏輯 */ }
private void cleanupExpiredData() { /* 實現邏輯 */ }
}
Trigger 類型選擇指南
| Trigger 類型 | 適用場景 | 配置範例 |
| SimpleTriggerBean | 固定間隔、有限次數、啟動延遲 | 每 5 分鐘、每小時、啟動後 10 秒執行一次 |
| CronTriggerBean | 複雜時間表達式、日曆基礎調度 | 每天凌晨、每月最後一天、工作日上午 9 點 |
常用 Cron 表達式速查
0 0 2 * * ? 每天凌晨 2:00
0 30 2 * * ? 每天凌晨 2:30
0 0 9 ? * MON-FRI 工作日上午 9:00
0 0 0 1 * ? 每月 1 號凌晨
0 0 0 L * ? 每月最後一天凌晨
0/30 * * * * ? 每 30 秒
0 0/5 * * * ? 每 5 分鐘
進階配置與最佳實踐
持久化任務(生產環境必備)
org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.impl.jdbcjobstore.StdJDBCDelegate
QRTZ_
true
AUTO
叢集環境注意事項
- 資料庫共享:所有節點連接同一資料庫,Quartz 表鎖機制保證任務不重複執行
- 時間同步:所有節點 NTP 同步,避免時間偏差導致觸發異常
- 實例 ID 自動:
instanceId=AUTO 自動生成唯一標識
監控與管理
- 整合 Spring Boot Actuator:
/actuator/quartz 端點查看任務狀態
- 自定義管理界面:查看/暫停/恢復/立即觸發任務
- 日誌記錄:任務執行時間、耗時、成功/失敗狀態入庫
Spring Boot 2.x 簡化配置(註解方式)
@Configuration
@EnableScheduling
public class ScheduleConfig {
@Bean
public JobDetail dataSyncJobDetail() {
return JobBuilder.newJob(DataSyncJob.class)
.withIdentity("dataSyncJob")
.storeDurably()
.usingJobData("batchSize", 1000)
.usingJobData("retryCount", 3)
.build();
}
@Bean
public Trigger dataSyncTrigger(JobDetail dataSyncJobDetail) {
return TriggerBuilder.newTrigger()
.forJob(dataSyncJobDetail)
.withIdentity("dataSyncTrigger")
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
.withIntervalInMinutes(5)
.repeatForever())
.startAt(Date.from(Instant.now().plusSeconds(1)))
.build();
}
@Bean
public SchedulerFactoryBean schedulerFactoryBean(Trigger dataSyncTrigger) {
SchedulerFactoryBean factory = new SchedulerFactoryBean();
factory.setTriggers(dataSyncTrigger);
factory.setStartupDelay(30);
return factory;
}
}