Spring定時器的兩種實現方式

shwenwen發表於2013-07-19

本文向您介紹Spring定時器的兩種實現方式,包括Java Timer定時和Quartz定時器,兩種Spring定時器的實現方式各有優點,可結合具體專案考慮是否採用

[@more@]

有兩種流行Spring定時器配置:Java的Timer類和OpenSymphony的Quartz。

1.Java Timer定時

首先繼承java.util.TimerTask類實現run方法

import java.util.TimerTask;
public class EmailReportTask extends TimerTask{
@Override
public void run() {
...
}
}
在Spring定義

...

配置Spring定時器




86400000value>
property>
bean>
timerTask屬性告訴ScheduledTimerTask執行哪個。86400000代表24個小時

啟動Spring定時器

Spring的TimerFactoryBean負責啟動定時任務



list>
property>
bean>
scheduledTimerTasks裡顯示一個需要啟動的定時器任務的列表。
可以透過設定delay屬性延遲啟動



86400000value>
property>

3600000value>
property>
bean>
這個任務我們只能規定每隔24小時執行一次,無法精確到某時啟動

2.Quartz定時器

首先繼承QuartzJobBean類實現executeInternal方法

import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;

public class EmailReportJob extends QuartzJobBean{
protected void executeInternal(JobExecutionContext arg0)
throws JobExecutionException {
...
}
}
在Spring中定義



EmailReportJobvalue>
property>




entry>
map>
property>
bean>
在這裡我們並沒有直接宣告一個EmailReportJob Bean,而是宣告瞭一個JobDetailBean。這個是Quartz的特點。JobDetailBean是Quartz的org.quartz.JobDetail的子類,它要求透過jobClass屬性來設定一個Job物件。

使用Quartz的JobDetail中的另一個特別之處是EmailReportJob的courseService屬性是間接設定的。JobDetail的jobDataAsMap屬性接受一個Map,包括設定給jobClass的各種屬性,當。JobDetailBean例項化時,它會將courseService Bean注入到EmailReportJob 的courseService 屬性中。

啟動定時器

Quartz的org.quartz.Trigger類描述了何時及以怎樣的頻度執行一個Quartz工作。Spring提供了兩個觸發器SimpleTriggerBean和CronTriggerBean。
SimpleTriggerBean與scheduledTimerTasks類似。指定工作的執行頻度,模仿scheduledTimerTasks配置 .




360000value>
property>

86400000value>
property>
bean>
startDelay也是延遲1個小時啟動

CronTriggerBean指定工作的準確執行時間




0 0 6 * * ?value>
property>
bean>
屬性cronExpression告訴何時觸發。最神秘就是cron表示式:

Linux系統的計劃任務通常有cron來承擔。一個cron表示式有至少6個(也可能7個)有空格分隔的時間元素。從左到右:

1.秒2.分3.小時4.月份中的日期(1-31)5.月份(1-12或JAN-DEC)6.星期中的日期(1-7或SUN-SAT)7.年份(1970-2099)
每個元素都顯示的規定一個值(如6),一個區間(9-12),一個列表(9,11,13)或一個萬用字元(*)。因為4和6這兩個元素是互斥的,因此應該透過設定一個問號(?)來表明不想設定的那個欄位,“/”如果值組合就表示重複次數(10/6表示每10秒重複6次)。

啟動定時器



list>
property>
bean>
triggers屬性接受一組觸發器。

另外一篇Java定時器文章:

http://shwenwen.itpub.net/post/34911/530914

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/143526/viewspace-1060751/,如需轉載,請註明出處,否則將追究法律責任。

相關文章