Quartz經典入門案列

1、Quartz簡介 

    Quartz是一個開放源碼項目,專一於任務調度器,提供了極爲普遍的特性如持久化任務,集羣和分佈式任務等。Spring對Quartz的集成與其對JDK Timer的集成在任務、觸發器和調度計劃的聲明式配置方面等都很是類似。 

    Quartz的核心由兩個接口和兩個類組成:Job和Scheduler接口,JobDetail和Trigger類。不一樣於JDK Timer,任務不是從實現一個Job接口的類實例開始運行,實際上Quartz在須要的時候才建立job類實例。能夠使用JobDetail類來包裝任 務狀態,並傳遞一個信息給Job,或在一個Job的屢次執行過程之間保存信息。 

2、Quartz任務調度 

1. 簡單任務調度 

    在Quartz中建立一個任務並執行,只須要實現Job接口類,在其execute()方法中處理你的業務邏輯。下面舉例說明。 

HelloWorldJob.java html

Java代碼   收藏代碼
  1. package com.learnworld.quartz;  
  2.   
  3. import org.quartz.Job;  
  4. import org.quartz.JobExecutionContext;  
  5. import org.quartz.JobExecutionException;  
  6.   
  7. public class HelloWorldJob implements Job {  
  8.   
  9.     public void execute(JobExecutionContext context) throws JobExecutionException {  
  10.                   //實現你的業務邏輯  
  11.         System.out.println("Hello!");  
  12.           
  13.     }  
  14. }  



HelloScheduling.java java

Java代碼   收藏代碼
  1. package com.learnworld.quartz;  
  2.   
  3. import java.util.Date;  
  4.   
  5. import org.quartz.JobDetail;  
  6. import org.quartz.Scheduler;  
  7. import org.quartz.SimpleTrigger;  
  8. import org.quartz.Trigger;  
  9. import org.quartz.impl.StdSchedulerFactory;  
  10.   
  11. public class HelloScheduling {  
  12.     public static void main(String[] args) throws Exception {  
  13.   
  14.         Scheduler scheduler = new StdSchedulerFactory().getScheduler();  
  15.         scheduler.start();  
  16.   
  17.         JobDetail jobDetail = new JobDetail("helloWorldJob",  
  18.                 Scheduler.DEFAULT_GROUP, HelloWorldJob.class);  
  19.   
  20.         Trigger trigger = new SimpleTrigger("simpleTrigger",  
  21.                 Scheduler.DEFAULT_GROUP, new Date(), null,  
  22.                 SimpleTrigger.REPEAT_INDEFINITELY, 1000);  
  23.           
  24.         scheduler.scheduleJob(jobDetail, trigger);  
  25.   
  26.     }  
  27. }  



須要說明幾點: 

    1)開始使用StdSchedulerFactory來獲取Scheduler的實例。每個scheduler能夠被啓動(start)、停止 (stop)和暫停(pause)。若是一個scheduler沒有被啓動或已經被暫停,則沒有觸發器會被啓用,因此首先使用start()方法啓動 scheduler。 

    2)建立JobDetail實例。它的構造參數有三個,第一個是任務名,任務名能夠被用做參數來應用須要暫停的任務;第二個是組名,組名能夠用來引用一組被集合在一塊兒的任務,這裏採用缺省組名,每個任務名在組內必須是惟一的;第三個參數是實現了特定任務的類。 

    3)建立Trigger實例。咱們使用SimpleTrigger類,它提供了相似JDK Timer風格的觸發器行爲。它的構造參數有六個,第一個和第二個爲觸發器名和組名,和上面相似;第三個爲任務開始時間;第四個爲結束時間,若是設置爲 空,表示不存在結束時間;第五個爲重複次數,容許你指的觸發器被觸發的最大次數,使用REPEAT_INDEFINITELY容許觸發器能夠被觸發無限 次;第六個是觸發器運行的時間間隔,是毫秒數。 

    4)最後經過scheduler.scheduleJob()方法調度任務。 

2. 使用JobDetail傳遞數據 

    每一個JobDetail實例都有關聯的JobDataMap實例,它實現了Map接口並容許經過鍵值來傳遞任務相關的數據。任務也能夠修改JobDataMap中的數據,在同一任務的屢次執行之間傳遞數據。下面舉例說明。 

MessageJob.java spring

Java代碼   收藏代碼
  1. package com.learnworld.quartz;  
  2.   
  3. import java.util.Map;  
  4.   
  5. import org.quartz.Job;  
  6. import org.quartz.JobExecutionContext;  
  7. import org.quartz.JobExecutionException;  
  8.   
  9. public class MessageJob implements Job {  
  10.   
  11.     public void execute(JobExecutionContext context) throws JobExecutionException {  
  12.           
  13.         Map properties = context.getJobDetail().getJobDataMap();  
  14.           
  15.         System.out.println("Previous Fire Time: " + context.getPreviousFireTime());  
  16.         System.out.println("Current Fire Time: " + context.getFireTime());  
  17.         System.out.println("Next Fire Time: " + context.getNextFireTime());  
  18.         System.out.println(properties.get("message"));  
  19.           
  20.     }  
  21. }  



MessageScheduling.java 分佈式

Java代碼   收藏代碼
  1. package com.learnworld.quartz;  
  2.   
  3. import java.util.Date;  
  4. import java.util.Map;  
  5.   
  6. import org.quartz.JobDetail;  
  7. import org.quartz.Scheduler;  
  8. import org.quartz.SimpleTrigger;  
  9. import org.quartz.Trigger;  
  10. import org.quartz.impl.StdSchedulerFactory;  
  11.   
  12. public class MessageScheduling {  
  13.     public static void main(String[] args) throws Exception {  
  14.   
  15.         Scheduler scheduler = new StdSchedulerFactory().getScheduler();  
  16.         scheduler.start();  
  17.   
  18.         JobDetail jobDetail = new JobDetail("messageJob",  
  19.                 Scheduler.DEFAULT_GROUP, MessageJob.class);  
  20.           
  21.         Map map = jobDetail.getJobDataMap();  
  22.         map.put("message""This is a message from Quartz");  
  23.   
  24.         Trigger trigger = new SimpleTrigger("simpleTrigger",  
  25.                 Scheduler.DEFAULT_GROUP, new Date(), new Date("Sat, 12 Aug 2011 13:30:00 GMT+0430"),  
  26.                 SimpleTrigger.REPEAT_INDEFINITELY, 5000);  
  27.           
  28.         scheduler.scheduleJob(jobDetail, trigger);  
  29.   
  30.     }  
  31. }  



3. 使用CronTrigger 

   上面提到了SimpleTrigger類,它提供了相似JDK Timer風格的觸發器功能。Quartz的出色在於它使用CronTrigger提供了對複雜觸發器的支持。 

    一個CronTrigger表達式,包含六個必須組件和一個可選組件。關於cron表達式,能夠參考這篇文檔:http://www.quartz-scheduler.org/docs/tutorials/crontrigger.html 

   下面舉例說明CronTrigger的使用。 

CronWithCalendarScheduling.java post

Java代碼   收藏代碼
  1. package com.learnworld.quartz;  
  2.   
  3. import java.util.Calendar;  
  4. import java.util.Date;  
  5. import java.util.Map;  
  6.   
  7. import org.quartz.CronTrigger;  
  8. import org.quartz.JobDetail;  
  9. import org.quartz.Scheduler;  
  10. import org.quartz.SimpleTrigger;  
  11. import org.quartz.Trigger;  
  12. import org.quartz.impl.StdSchedulerFactory;  
  13. import org.quartz.impl.calendar.HolidayCalendar;  
  14.   
  15. public class CronWithCalendarScheduling {  
  16.     public static void main(String[] args) throws Exception {  
  17.   
  18.         Calendar cal = Calendar.getInstance();  
  19.         cal.set(2010, Calendar.OCTOBER, 31);  
  20.           
  21.         HolidayCalendar calendar  = new HolidayCalendar();  
  22.         calendar.addExcludedDate(cal.getTime());  
  23.           
  24.         Scheduler scheduler = new StdSchedulerFactory().getScheduler();  
  25.         scheduler.start();  
  26.           
  27.         scheduler.addCalendar("calendar", calendar, truefalse);  
  28.           
  29.         JobDetail jobDetail = new JobDetail("messageJob",  
  30.                 Scheduler.DEFAULT_GROUP, MessageJob.class);  
  31.           
  32.         Map map = jobDetail.getJobDataMap();  
  33.         map.put("message""This is a message from Quartz");  
  34.   
  35.         String cronExpression = "3/5 * 17,18,19,20 * * ?";  
  36.           
  37.         Trigger trigger = new CronTrigger("cronTrigger",  
  38.                 Scheduler.DEFAULT_GROUP, cronExpression);  
  39.           
  40.         scheduler.scheduleJob(jobDetail, trigger);  
  41.     }  
  42. }  



須要說明幾點: 

    1)建立了HolidayCalendar實例,使用addExcluderData()方法排除了2010年10月31日。再使用addCalendar()方法,將這個Calendar加入到Scheduler中。 

    2)這個cron表達式的含義是,天天17:00-20:59之間每一分鐘的第三秒開始運行,每五秒執行一次。 

三. Spring對Quartz調度的支持 

    Spring對Quartz集成與其對JDK Timer調度集成相似,你能夠在配置文件中配置任務調度。僅須要在程序里加載ApplicationContext,Spring會自動啓動調度器。 

quartz.xml spa

Java代碼   收藏代碼
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">  
  3. <beans>  
  4.     <bean id="job"  
  5.         class="org.springframework.scheduling.quartz.JobDetailBean">  
  6.         <property name="jobClass">  
  7.             <value> com.learnworld.quartz.MessageJob </value>  
  8.         </property>  
  9.         <property name="jobDataAsMap">  
  10.             <map>  
  11.                 <entry key="message">  
  12.                     <value>This is a message from Spring Quartz configuration!</value>  
  13.                 </entry>  
  14.             </map>  
  15.         </property>  
  16.     </bean>  
  17.     <bean id="trigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">  
  18.         <property name="startDelay">  
  19.             <value>1000</value>  
  20.         </property>  
  21.         <property name="repeatInterval">  
  22.             <value>3000</value>  
  23.         </property>  
  24.         <property name="jobDetail">  
  25.             <ref local="job" />  
  26.         </property>  
  27.     </bean>  
  28.   
  29.     <bean id="schdulerFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  
  30.         <property name="triggers">  
  31.             <list>  
  32.                 <ref local="trigger" />  
  33.             </list>  
  34.         </property>  
  35.     </bean>  
  36. </beans>  



SimpleSpringQuartzIntegration.java xml

Java代碼   收藏代碼
  1. package com.learnworld.quartz;  
  2.   
  3. import org.springframework.context.ApplicationContext;  
  4. import org.springframework.context.support.FileSystemXmlApplicationContext;  
  5.   
  6. public class SimpleSpringQuartzIntegration {  
  7.   
  8.     public static void main(String[] args) {  
  9.   
  10.         ApplicationContext ac = new FileSystemXmlApplicationContext("src/conf/quartz.xml");  
  11.     }  
  12.   
  13. }  



須要說明幾點: 

    1)採用JobDetailBean類,它擴展了JobDetai類,採用可聲明方式配置任務數據。缺省狀況下,採用<bean>標籤的id做爲任務名,使用缺省組做爲組名,經過jobDataAsMap做爲配置任務數據。 

    2)創建觸發器。能夠選擇SimpleTriggerBean或CronTriggerBean類。SimpleTriggerBean缺省狀況下把可重複執行次數設爲無限。 

    3)建立schedulerFactory。缺省狀況下,SchedulerFactoryBean建立一個StdSchedulerFactory的實 例,後者建立Scheduler的實現。能夠經過設置schedulerFactoryClass屬性來覆蓋這個行爲,須要繼承 SchedulerFactory接口來實現你本身的版本。htm

引入的jar包:blog

相關文章
相關標籤/搜索