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

徹底理解 Spring 定時任務:TimerTask 整合與原理剖析

     編輯:Java 相關知識

Spring 將 JDK Timer/TimerTask 封裝為 Bean,僅需簡單 XML 配置即可實現定時任務,無需手寫線程管理代碼。

極簡配置三步走

<!-- 1. 業務任務 Bean -->
<bean id="infoCenterAutoBuildTask" class="com.teesoo.teanet.scheduling.InfoCenterAutoBuildTask">
  <property name="baseService" ref="baseService"/>
  <property name="htmlCreator" ref="htmlCreator"/>
</bean>

<!-- 2. 定時包裝器 -->
<bean id="scheduledTask" class="org.springframework.scheduling.timer.ScheduledTimerTask">
  <property name="delay" value="10000"/>       <!-- 首次延遲 10s -->
  <property name="period" value="1000000"/>    <!-- 週期 1000s -->
  <property name="timerTask" ref="infoCenterAutoBuildTask"/>
</bean>

<!-- 3. Timer 工廠 -->
<bean id="timerFactory" class="org.springframework.scheduling.timer.TimerFactoryBean">
  <property name="scheduledTimerTasks">
    <list><ref bean="scheduledTask"/></list>
  </property>
</bean>

業務類僅需繼承 TimerTask

public class InfoCenterAutoBuildTask extends TimerTask {
  private BaseService baseService;
  private HtmlCreator htmlCreator;
  // setter 省略
  public void run() {
    // 這裡編寫定時業務邏輯
  }
}

源碼級原理:TimerFactoryBean 生命周期

public class TimerFactoryBean implements FactoryBean, InitializingBean, DisposableBean {
  private ScheduledTimerTask[] scheduledTimerTasks;
  private Timer timer;

  public void afterPropertiesSet() {
    timer = createTimer(daemon);  // 默認非守護線程
    for (ScheduledTimerTask task : scheduledTimerTasks) {
      if (task.getPeriod() > 0) {
        if (task.isFixedRate())
          timer.scheduleAtFixedRate(task.getTimerTask(), task.getDelay(), task.getPeriod());
        else
          timer.schedule(task.getTimerTask(), task.getDelay(), task.getPeriod());
      } else {
        timer.schedule(task.getTimerTask(), task.getDelay()); // 單次執行
      }
    }
  }

  public void destroy() { timer.cancel(); }  // 容器關閉時取消所有任務
}

關鍵屬性對照表

屬性對應 JDK 方法語義
delayschedule(task, delay)首次執行延遲毫秒數
periodschedule(task, delay, period)固定延遲週期(上次結束後間隔)
fixedRate=truescheduleAtFixedRate(...)固定頻率週期(上次開始後間隔)
daemon=truenew Timer(true)守護線程,應用關閉立即終止任務

局限性與進階替代方案

  • ⚠️ 單線程串行執行:前一任務阻塞會延遲後續任務。
  • ⚠️ 無持久化/集群支援:重啟丟失排程,多節點會重複執行。
  • 🚀 生產建議:遷移至 Quartz(Spring 整合 SchedulerFactoryBean)或 Spring @Scheduled + ThreadPoolTaskScheduler,支援 Cron 表達式、持久化、集群、異步執行池。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved