例如在開發購物網站時會遇到一個問題,因白天訂單多流量大,爲減輕網站壓力要求一些不是太急的任務(如給註冊用戶發送廣告郵件、清理平常垃圾信息等)放在凌晨流量較小時間段去執行,這個時候就須要使用到任務調度,指定在某個時間內執行某個任務java
Quartz調度器爲調度工做提供更豐富的支持,與Java定時器同樣,可以使用Quartz指定每隔多少毫秒執行一個工做,但Quartz比Java的Timer優點在於Quartz容許調度一個工做在某個特定的時間或日期執行。web
QuartzJobBean實現org.quartz.Job接口。QuartzJobBean子類應當覆蓋executeInternal()方法,在executeInternal()方法中定義預約的時刻應執行動做(這一步是指明作什麼)spring
參考代碼以下:CustomerQuartzJobBean.javaapp
package www.enfp.cc.springquartz; import java.util.Date; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.springframework.scheduling.quartz.QuartzJobBean; public class CustomerQuartzJobBean extends QuartzJobBean { @Override protected void executeInternal(JobExecutionContext arg0) throws JobExecutionException { //指定須要執行的任務,這裏僅僅是輸出當前時間 System.out.println("執行調度任務: (當前時間:" + new Date() + ")"); } }
1.配置執行工做<作什麼>ide
JobDetailBean是Quartz的JobDetail的子類,經過jobClass屬性來設置一個Job對象,將第一步的QuartzJobBean的子類的全路徑傳給JobDetailBean的jobClass屬性測試
參考代碼以下:網站
<!-- 配置執行工做(作什麼) --> <bean id="jobDetail" class="org.springframework.scheduling.quartz.JobDetailBean"> <property name="jobClass"> <value>www.enfp.cc.springquartz.CustomerQuartzJobBean</value> </property> </bean>
2.觸發器Trigger的配置(配置執行時間和執行哪一個工做)<什麼時間作什麼>spa
Quartz的Trigger類描述了調度時機和頻度,Spring提供了兩個觸發器:SimpleTriggerBean、CronTriggerBean。code
(1).使用SimpleTriggerBean調度器(屬性)介紹xml
參考代碼以下:
<!-- 執行效果:啓動任務6秒後執行任務,而且每一個4秒執行一次 --> <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean"> <!-- 指定任務(作什麼) --> <property name="jobDetail"> <ref bean="jobDetail" /> </property> <!-- 服務啓動後延遲多少時間執行,單位毫秒 --> <property name="startDelay" value="6000"></property> <!-- 重複執行任務的時間間隔,單位毫秒 --> <property name="repeatInterval" value="4000"></property> </bean>
(2).使用CronTriggerBean調度器(屬性)介紹
一個cron表達式有至少6個(也多是7個)由空格分隔的時間元素。從左至右,這些元素的定義以下
注意: 每個元素均可顯式規定一個值(如6),一個區間(如9-12),一個列表(如9,11,13)或一個通配符(如*)。「月份中的日期」和「星期中的日期」互斥,應經過設置一個問號(?)來代表你不想設置的那個字段
參考代碼以下:
<!-- (觸發器的配置)配置執行時間(或間隔)和執行哪一個工做(什麼時間作什麼) --> <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <!-- (作哪一個工做) --> <property name="jobDetail" ref="jobDetail"></property> <!-- 配置cron表達式(什麼時間作) --> <property name="cronExpression" value="0 * 11 * * ?"></property> </bean>
(3).啓動觸發器
使用Spring的SchedulerFactoryBean類可以使用list表示啓動多個觸發器
參考代碼以下:
<!-- 啓動觸發器 --> <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <!-- 能夠啓動多個觸發器,因此採用list標籤 --> <list> <ref bean="cronTrigger"/> </list> </property> </bean>
1.web應用中使用(在web.xml文件加載beans.xml)
2.在java 應用中使用ClassPathXmlApplicationContext類加載beans.xml
參考代碼以下:SpringQuartzTest.java
package www.enfp.cc.springquartz; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class SpringQuartzTest { public static void main(String[] args) { ApplicationContext applicationContext = new ClassPathXmlApplicationContext( "beans.xml"); } }
補充:
常見一些cron表達式的例子: