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

Spring 定時任務配置指南:Quartz 整合與 JobDetail/Trigger 詳解

     編輯:Java 綜合教學

Spring + Quartz 整合架構

Spring 透過 SchedulerFactoryBean 整合 Quartz 調度器,提供聲明式配置定時任務。核心三要素:

組件Spring Bean職責
JobJobDetailBean定義任務邏輯類與參數
TriggerSimpleTriggerBean / CronTriggerBean定義觸發時間規則
SchedulerSchedulerFactoryBean管理調度器生命週期,綁定 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
        
    
    

叢集環境注意事項

  1. 資料庫共享:所有節點連接同一資料庫,Quartz 表鎖機制保證任務不重複執行
  2. 時間同步:所有節點 NTP 同步,避免時間偏差導致觸發異常
  3. 實例 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;
    }
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved