<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Terry.Li-彬

    虛其心,可解天下之問;專其心,可治天下之學;靜其心,可悟天下之理;恒其心,可成天下之業。

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      143 隨筆 :: 344 文章 :: 130 評論 :: 0 Trackbacks
    一、Quartz簡介 ?

    ??? Quartz是一個開放源碼項目,專注于任務調度器,提供了極為廣泛的特性如持久化任務,集群和分布式任務等。Spring對Quartz的集成與其對JDK Timer的集成在任務、觸發器和調度計劃的聲明式配置方面等都非常相似。?

    ??? Quartz的核心由兩個接口和兩個類組成:Job和Scheduler接口,JobDetail和Trigger類。不同于JDK Timer,任務不是從實現一個Job接口的類實例開始運行,實際上Quartz在需要的時候才創建job類實例。可以使用JobDetail類來包裝任務狀態,并傳遞一個信息給Job,或在一個Job的多次執行過程之間保存信息。?

    二、Quartz任務調度?

    1. 簡單任務調度?

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

    HelloWorldJob.java?
    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代碼?
    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. }??


    需要說明幾點:?

    ??? 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?
    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?
    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,?true,?false);??
    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?
    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?
    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接口來實現你自己的版本。
    posted on 2010-11-02 08:52 禮物 閱讀(2650) 評論(0)  編輯  收藏 所屬分類: javaspring
    主站蜘蛛池模板: 亚洲 国产 图片| 成在人线av无码免费高潮水| 中文字幕精品亚洲无线码一区应用| 中文字幕免费在线看线人| 精品一区二区三区高清免费观看 | 色多多免费视频观看区一区| 亚洲日韩乱码中文无码蜜桃臀| 亚洲午夜久久久久久久久久 | 亚洲精品乱码久久久久久蜜桃图片| 亚洲小视频在线观看| 亚洲国产综合精品中文第一| 亚洲va无码va在线va天堂| 亚洲一本大道无码av天堂| 四只虎免费永久观看| 精品久久久久久久免费加勒比| 免费黄色网址网站| 精品无码国产污污污免费网站| 人妻免费一区二区三区最新| sihu国产精品永久免费| 免费无码午夜福利片69| 黄网站色视频免费看无下截 | 一级午夜免费视频| 黄色免费在线网址| 国产午夜亚洲精品不卡电影| 亚洲精品无码久久久久APP | 在线观看免费精品国产| 国产精品美女午夜爽爽爽免费| 四虎永久在线观看免费网站网址| 久久99热精品免费观看牛牛| 成全高清在线观看免费| 国产一精品一av一免费爽爽| 日本高清高色视频免费| 久久久久久久久久国产精品免费| 免费观看在线禁片| 99久久免费看国产精品| 18禁美女裸体免费网站| 午夜国产精品免费观看| 色婷婷7777免费视频在线观看| 在线看片免费不卡人成视频| 一个人免费高清在线观看| 全免费a级毛片免费看无码|