目前有兩種流行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定義
ScheduledTimerTask運行哪個。 86400000代表24小時
啟動Spring定時器
Spring的TimerFactoryBean負責啟動定時任務
<bean id="scheduleReportTask" class="org.springframework.scheduling.timer.ScheduledTimerTask"> <property name="timerTask" ref="reportTimerTask" /> <property name="period"> <value>86400000value> property> bean>
scheduledTimerasks完成的定時器清單。
可以透過設定delay屬性延遲啟動
<bean class="org.springframework.scheduling.timer.TimerFactoryBean"> <property name="scheduledTimerTasks"> <list><ref bean="scheduleReportTask"/>list> property> bean>
這個任務我們只能規定每隔24小時運作一次,無法精確到某時啟動以下完成設定器方法
<bean id="scheduleReportTask" class="org.springframework.scheduling.timer.ScheduledTimerTask"> <property name="timerTask" ref="reportTimerTask" /> <property name="period"> <value>86400000value> property> <property name="delay"> <value>3600000value> property> bean>
在Spring中定義
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 { ... } }
在這裡我們並沒有直接聲明一個EmailReportJob,而是聲明了一個JobDetail Beanean。這個是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配置 .<bean id="reportJob" class="org.springframework.scheduling.quartz.JobDetailBean"> <property name="jobClass"> <value>EmailReportJobvalue> property> <property name="jobDataAsMap"> <map> <entry key="courseService"> <ref bean="courseService"/> entry> map> property> bean>
startDelay也是延遲1個小時啟動
每個元素都顯示的規定一個值(如6),一個區間(9-12),一個列表(9,11,13)或一個通配符(*) 。因為4和6這兩個元素是互斥的,因此應該透過設定一個問號(?)來表示不想設定的那個字段,「/」如果值組合就表示重複次數(10/6表示每10秒重複6次)。
啟動定時器
<bean id="simpleReportTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean"> <property name="jobDetail" ref="reprotJob" /> <property name="startDelay"> <value>360000value> property> <property name="repeatInterval"> <value>86400000value> property> bean>
triggers屬性接受一組觸發器。
好了,本文內容到此結束了,寫的還不錯吧,有不足之處,歡迎各位大俠提出寶貴意見。