1. 程式人生 > >Cron 觸發器及相關內容 (第三部分)

Cron 觸發器及相關內容 (第三部分)

四. 為 CronTrigger 使用起迄日期

Cron 表示式是用來決定一個 Trigger 被觸發執行一個 Job 的日期和次數。當你建立一個 CronTrigger 例項,假如沒為它指定一個開始時間,這個 Trigger 當然就會假定是在依賴於 Cron 表示式儘早的被觸發。例如,如果你用這個表示式
0 * 14-20 * * ?
這個 Trigger 會在每天的從下午 2 點到下午的 7:59 間的每分鐘觸發一次。一旦你運行了這個表示式的 CronTrigger,假如當前是下午 2 點後(不能超過 7:59 PM--譯者注),它將會立即觸發。它會在每天無限期的被觸發。
另一方面,倘若你希望這個計劃直到下一天才開始,並且只執行兩天,你就可以用 CronTrigger 的 setStartTime() 和 setEndTime() 方法來形成一個 "定時箱" 來觸發。程式碼 5.2 描述了限定 CronTrigger 僅觸發兩天的例子。
程式碼 5.2. 你可以對 CronTrigger 用 startTime 和 endTime

  1. public class Listing_5_2 {  
  2. static Log logger = LogFactory.getLog(Listing_5_2.class);  
  3. public static void main(String[] args) {  
  4.           Listing_5_2 example = new Listing_5_2();  
  5.           example.runScheduler();  
  6.      }  
  7. public void runScheduler() {  
  8.           Scheduler scheduler = null;  
  9. try {  
  10. // Create a default instance of the Scheduler
  11.               scheduler = StdSchedulerFactory.getDefaultScheduler();  
  12.               scheduler.start();  
  13.               logger.info("Scheduler was started at " + new Date());  
  14. // Create the JobDetail
  15.               JobDetail jobDetail = new JobDetail("PrintInfoJob",  
  16.                         Scheduler.DEFAULT_GROUP,  
  17.                                     PrintInfoJob.class);  
  18. // Create a CronTrigger
  19. try {  
  20. // cron that fires every min from 2  8pm
  21.                    CronTrigger trigger =  
  22. new CronTrigger("MyTrigger", null,  
  23. "0 * 14-20 * * ?");  
  24.                    Calendar cal = Calendar.getInstance();  
  25. // Set the date to 1 day from now
  26.                    cal.add(Calendar.DATE, 1);  
  27.                    trigger.setStartTime(cal.getTime());  
  28. // Move ahead 2 days to set the end time
  29.                    cal.add(Calendar.DATE, 2);  
  30.                    trigger.setEndTime(cal.getTime());  
  31.                    scheduler.scheduleJob(jobDetail, trigger);  
  32.               } catch (ParseException ex) {  
  33.                    logger.error("Couldn't parse cron expr", ex);  
  34.               }  
  35.          } catch (SchedulerException ex) {  
  36.               logger.error(ex);  
  37.          }  
  38.     }  

public class Listing_5_2 { static Log logger = LogFactory.getLog(Listing_5_2.class); public static void main(String[] args) { Listing_5_2 example = new Listing_5_2(); example.runScheduler(); } public void runScheduler() { Scheduler scheduler = null; try { // Create a default instance of the Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); scheduler.start(); logger.info("Scheduler was started at " + new Date()); // Create the JobDetail JobDetail jobDetail = new JobDetail("PrintInfoJob", Scheduler.DEFAULT_GROUP, PrintInfoJob.class); // Create a CronTrigger try { // cron that fires every min from 2 8pm CronTrigger trigger = new CronTrigger("MyTrigger", null, "0 * 14-20 * * ?"); Calendar cal = Calendar.getInstance(); // Set the date to 1 day from now cal.add(Calendar.DATE, 1); trigger.setStartTime(cal.getTime()); // Move ahead 2 days to set the end time cal.add(Calendar.DATE, 2); trigger.setEndTime(cal.getTime()); scheduler.scheduleJob(jobDetail, trigger); } catch (ParseException ex) { logger.error("Couldn't parse cron expr", ex); } } catch (SchedulerException ex) { logger.error(ex); } } }
程式碼 5.2 中的例子使用了 java.util.Calendar 來為 Trigger 選擇一個開始和結束時間週期。在上面例子中,Trigger 將會在 Scheduler 啟動後的下一天開始觸發,並只在開始觸發後的兩天內有效。
使用 CronTrigger 的 startTime 和 endTime 屬性的效果有點像 SimpleTrigger。
五. 為 CronTrigger 使用 TriggerUtils
在第四章,"安排 Job" 中介紹了 org.quartz 包中的 TriggerUtils 類,它簡化了兩種型別的 Trigger 的建立。只要可能的話,你應該嘗試用 TriggerUtils 類的方法來建立你的 Trigger。
例如,假如你需要在每天的下午 5:30 執行一個 Job,你可以用下面的程式碼:

  1. try {  
  2. // A CronTrigger that fires @ 5:30PM
  3.   CronTrigger trigger = new CronTrigger("CronTrigger", null, "0 30 17 ? * *");  
  4. } catch (ParseException ex) {  
  5.   logger.error("Couldn't parse cron expression", ex);  

try { // A CronTrigger that fires @ 5:30PM CronTrigger trigger = new CronTrigger("CronTrigger", null, "0 30 17 ? * *"); } catch (ParseException ex) { logger.error("Couldn't parse cron expression", ex); }
或者你能用上 TriggerUtils,如下:

  1. // A CronTrigger that fires @ 5:30PM
  2. Trigger trigger = TriggerUtils.makeDailyTrigger(17, 30);  
  3. trigger.setName("CronTrigger"); 

// A CronTrigger that fires @ 5:30PM Trigger trigger = TriggerUtils.makeDailyTrigger(17, 30); trigger.setName("CronTrigger");
TriggerUtils 使得我們更簡單方便的使用 Trigger,而又未放棄太多的靈活性。
六. 在 JobInitializationPlugin 中使用 CronTrigger

儘管我們要到第八章,"使用 Quartz 外掛" 才會講到外掛,但還是值得提前展現一下 CronTrigger 如何應用於  quartz_jobs.xml 檔案中來指定 Job 資訊的。JobInitialzationPlugin 可用來從 XML 檔案中載入 Job 的資訊。
正如 SimpleTrigger 一樣,你可在 XML 檔案中指定 CronTrigger 的表示式,並且 Quartz 的 Scheduler 將會利用這一資訊來安排你的 Job。這對於你想在你的程式程式碼之外宣告你的 Job 資訊時特別方便。程式碼 5.3 顯示了 quartz_jobs.xml 檔案內容,它被 JobInitializationPlugin  用來加作 Job 資訊。
程式碼 5.3. CronTrigger 可在 XML 檔案中指定,並由 JobInitializationPlugin 載入

  1. <?xml version='1.0' encoding='utf-8'?>
  2. <quartz>
  3. <job>
  4. <job-detail>
  5. <name>PrintInfoJob</name>
  6. <group>DEFAULT</group>
  7. <description>
  8.       A job that prints out some basic information.  
  9. </description>
  10. <job-class>
  11.       org.cavaness.quartzbook.common.PrintInfoJob  
  12. </job-class>
  13. </job-detail>
  14. <trigger>
  15. <cron>
  16. <name>printJobInfoTrigger</name>
  17. <group>DEFAULT</group>
  18. <job-name>PrintInfoJob</job-name>
  19. <job-group>DEFAULT</job-group>
  20. <!-- Fire 7:30am Monday through Friday -->
  21. <cron-expression>0 30 7 ? * MON-FRI</cron-expression>
  22. </cron>
  23. </trigger>
  24. </job>
  25. </quartz>

<?xml version='1.0' encoding='utf-8'?> <quartz> <job> <job-detail> <name>PrintInfoJob</name> <group>DEFAULT</group> <description> A job that prints out some basic information. </description> <job-class> org.cavaness.quartzbook.common.PrintInfoJob </job-class> </job-detail> <trigger> <cron> <name>printJobInfoTrigger</name> <group>DEFAULT</group> <job-name>PrintInfoJob</job-name> <job-group>DEFAULT</job-group> <!-- Fire 7:30am Monday through Friday --> <cron-expression>0 30 7 ? * MON-FRI</cron-expression> </cron> </trigger> </job> </quartz>
程式碼  5.3 中的 Cron 表示式與 程式碼 5.1 中。當 Quartz 載入這個 XML 後,就會安排 PrintInfoJob (也已在 XML  中列出) 在從星期一到星期五的早上 7:30 執行。關於 JobInitializationPlugin 更多的說明見第八章。