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

Spring 3 @Scheduled 註解實現定時任務完整指南

     編輯:Java 相關知識

Spring 3 引入了基於註解的任務調度支持,僅需兩步即可輕鬆構建定時任務:編寫任務類標註 @Scheduled,並在 XML 中啟用任務命名空間。本文將通過完整示例,詳細講解三種觸發模式(固定延遲、固定頻率、Cron 表達式)的區別與配置細節。

快速上手:兩步完成

  1. 創建任務類,方法上添加 @Scheduled 註解。
  2. Spring XML 配置文件中引入 task 命名空間,聲明執行器、調度器並啟用註解驅動。

任務類實現

package com.zywang.spring.task;

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class SpringTaskDemo {

    // fixedDelay: 上一次執行結束後 5 秒再執行
    @Scheduled(fixedDelay = 5000)
    public void doSomethingWithDelay() {
        System.out.println("I'm doing with delay now! " + new java.util.Date());
    }

    // fixedRate: 無視執行時長,每 5 秒觸發一次
    @Scheduled(fixedRate = 5000)
    public void doSomethingWithRate() {
        System.out.println("I'm doing with rate now! " + new java.util.Date());
    }

    // cron: 每分鐘第 0,5,10... 秒觸發 (每 5 秒)
    @Scheduled(cron = "0/5 * * * * *")
    public void doSomethingWithCron() {
        System.out.println("I'm doing with cron now! " + new java.util.Date());
    }
}

三種觸發模式深度對比

屬性觸發邏輯適用場景並發風險
fixedDelay上次執行結束 → 等待指定時間 → 下次執行任務耗時不固定,需保證間隔低 (串行)
fixedRate固定時間間隔觸發,若上次未結束則並發執行固定頻率采集、心跳上報高 (需線程池)
cron基於 Cron 表達式精確時間點觸發定時備份、報表生成等業務定時中 (取決於執行時長)

Cron 表達式結構 (6 域): 秒 分 時 日 月 周

  • 0/5 * * * * *:每分鐘第 0、5、10... 秒 (每 5 秒)
  • 0 0 2 * * ?:每天凌晨 2 點整
  • 0 0/30 9-17 * * MON-FRI:工作日 9-17 點每半小時

Spring XML 配置詳解

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="https://www.springframework.org/schema/beans"
       xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
       xmlns:task="https://www.springframework.org/schema/task"
       xsi:schemaLocation="
           https://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
           https://www.springframework.org/schema/task https://www.springframework.org/schema/task/spring-task-3.0.xsd">

    <!-- 線程池執行器:用於 @Scheduled 方法的實際運行線程 -->
    <task:executor id="executor" pool-size="5" />

    <!-- 調度器:負責按時觸發任務,pool-size 應 >= 並發任務數 -->
    <task:scheduler id="scheduler" pool-size="10" />

    <!-- 啟用 @Scheduled 註解驅動,關聯執行器與調度器 -->
    <task:annotation-driven executor="executor" scheduler="scheduler" />

</beans>

關鍵配置說明

  • task:executor:定義執行任務的線程池,pool-size 控制最大並發數。
  • task:scheduler:定義調度線程池,負責按時提交任務到執行器。
  • task:annotation-driven:掃描 @Scheduled 註解,將任務註冊到調度器。
  • 任務類必須是 Spring 管理的 Bean (如加 @Component 或在 XML 定義 <bean>),否則註解不生效。

進階技巧與注意事項

  1. 異常處理:任務方法拋出異常會導致後續調度停止,建議內部 try-catch 並記錄日誌,或實現 ErrorHandler 接口統一處理。
  2. 動態修改周期:@Scheduled 註解屬性為常量,無法運行時修改。需動態調度請使用 TaskScheduler API 編程式註冊 Runnable。
  3. 時區問題:Cron 觸發默認使用系統時區,跨時區部署請在 task:scheduler 指定 timezone 屬性或配置 Trigger 實現。
  4. 集群環境:單機調度無法保證高可用,生產環境建議接入 Quartz + 數據庫鎖 或 XXL-JOB 等分布式調度平台。

版本兼容性提示

本示例基於 Spring 3.0.5 驗證。Spring 4+ 繼續支持此配置,但推薦遷移至 Java Config (@EnableScheduling + @Configuration) 以獲得類型安全與 IDE 支持。

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