有兩種流行Spring定時器配置:Java的Timer類和OpenSymphony的Quartz。
1.Java Timer定時php
首先繼承java.util.TimerTask類實現run方法java
- import java.util.TimerTask;
- public class EmailReportTask extends TimerTask{
- @Override
- public void run() {
- ...
- }
- }
在Spring定義spring
...ide
配置Spring定時器spa
- <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個小時xml
啓動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小時運行一次,沒法精確到某時啓動get
2.Quartz定時器it
首先繼承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屬性接受一組觸發器。