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>
public class InfoCenterAutoBuildTask extends TimerTask {
private BaseService baseService;
private HtmlCreator htmlCreator;
// setter 省略
public void run() {
// 這裡編寫定時業務邏輯
}
}
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 方法 | 語義 |
|---|---|---|
| delay | schedule(task, delay) | 首次執行延遲毫秒數 |
| period | schedule(task, delay, period) | 固定延遲週期(上次結束後間隔) |
| fixedRate=true | scheduleAtFixedRate(...) | 固定頻率週期(上次開始後間隔) |
| daemon=true | new Timer(true) | 守護線程,應用關閉立即終止任務 |
SchedulerFactoryBean)或 Spring @Scheduled + ThreadPoolTaskScheduler,支援 Cron 表達式、持久化、集群、異步執行池。