Spring Timer 兩種實現

有兩種流行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定時器

<bean id="scheduleReportTask" class="org.springframework.scheduling.timer.ScheduledTimerTask">   <property name="timerTask" ref="reportTimerTask" />   <property name="period">   <value>86400000value>   property>   bean>

timerTask屬性告訴ScheduledTimerTask運行哪個。86400000代表24個小時

啓動Spring定時器

Spring的TimerFactoryBean負責啓動定時任務

<bean class="org.springframework.scheduling.timer.TimerFactoryBean">   <property name="scheduledTimerTasks">      <list><ref bean="scheduleReportTask"/>list>   property>   bean>   scheduledTimerTasks裏顯示一個需要啓動的定時器任務的列表。   可以通過設置delay屬性延遲啓動   <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>

這個任務我們只能規定每隔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中定義

<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>

在這裏我們並沒有直接聲明一個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配置 .

<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>

startDelay也是延遲1個小時啓動

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

<bean id="cronReportTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">   <property name="jobDetail" ref="reprotJob" />   <property name="cronExpression">   <value>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次)。

啓動定時器

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">       <property name="triggers">          <list><ref bean="cronReportTrigger"/>list>       property>   bean>

triggers屬性接受一組觸發器。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章