作業調度框架 Quartz 學習筆記(四) -- 接收參數和維護狀態

<<Quartz中Job的參數傳遞和狀態保存>>

如果你想在 某個job執行的時候傳入參數,參數在job執行過程中對參數有所修改,並且在job執行完畢後把參數返回
那麼你需要學習一下現在的這個例子了,因爲它正是你所想要的 ......

 

我的建議是先把代碼運行起來看結果,然後再去看代碼.

還是老套路,兩個類 一個job類:ColorJob.java   一個調度類: JobStateExample.java

代碼 :

ColorJob.java

[java] view plaincopy
  1. /** 
  2.  * <p> 這只是一個簡單的工作,接收參數和維護狀態  </p> 
  3.  */  
  4. <span style="color:#660000;"><span style="background-color: rgb(255, 204, 255);">//小心,這裏的註釋很重要</span>  
  5. </span>@PersistJobDataAfterExecution    
  6. @DisallowConcurrentExecution  
  7. public class ColorJob implements Job {  
  8.     // 靜態變量  
  9.     public static final String FAVORITE_COLOR = "favorite color";  
  10.     public static final String EXECUTION_COUNT = "count";  
  11.   
  12.     // Quartz 將每次將會重新實例化對象 ,非靜態的成員變量不能用來保持狀態  
  13.     private int _counter = 1;  
  14.   
  15.     @Override   
  16.     public void execute(JobExecutionContext context)  
  17.             throws JobExecutionException {  
  18.         // job 的名字  
  19.         String jobName = context.getJobDetail().getKey().getName();  
  20.         // 任務執行的時間  
  21.         SimpleDateFormat dateFormat = new SimpleDateFormat(  
  22.                 "yyyy 年 MM 月 dd 日  HH 時 mm 分 ss 秒");  
  23.         String jobRunTime = dateFormat.format(Calendar.getInstance().getTime());  
  24.   
  25.         // 獲取 JobDataMap , 並從中取出參數   
  26.         JobDataMap data = context.getJobDetail().getJobDataMap();  
  27.         String favoriteColor = data.getString(FAVORITE_COLOR);  
  28.         int count = data.getInt(EXECUTION_COUNT);  
  29.         System.out  
  30.                 .println("ColorJob: " + jobName + " 在 " + jobRunTime + " 執行了 ...  \n"  
  31.                         + "      喜歡的顏色是:  " + favoriteColor + "\n"  
  32.                         + "      執行次數統計(from job jobDataMap): " + count + "\n"  
  33.                         + "      執行次數統計( from job 類的成員變 量 ): "  
  34.                         + _counter+ " \n ");  
  35.         // 每次+1 並放回Map 中  
  36.         count++;  
  37.         data.put(EXECUTION_COUNT, count);  
  38.         // 成員變量的增加沒有意義,每次實例化對象的時候會 同時初始化該變量  
  39.         _counter++;  
  40.     }  
  41. }  

JobStateExample.java

[java] view plaincopy
  1. import static org.quartz.DateBuilder.nextGivenSecondDate;  
  2. import static org.quartz.JobBuilder.newJob;  
  3. import static org.quartz.SimpleScheduleBuilder.simpleSchedule;  
  4. import static org.quartz.TriggerBuilder.newTrigger;  
  5. import java.text.SimpleDateFormat;  
  6. import java.util.Date;  
  7. import org.quartz.JobDetail;  
  8. import org.quartz.Scheduler;  
  9. import org.quartz.SchedulerFactory;  
  10. import org.quartz.SchedulerMetaData;  
  11. import org.quartz.SimpleTrigger;  
  12. import org.quartz.impl.StdSchedulerFactory;  
  13.   
  14. public class JobStateExample {  
  15.   
  16.     public static void main(String[] args) throws Exception {  
  17.         JobStateExample example = new JobStateExample();  
  18.         example.run();  
  19.     }  
  20.   
  21.     public void run() throws Exception {  
  22.   
  23.         // 日期格式化  
  24.         SimpleDateFormat dateFormat = new SimpleDateFormat(  
  25.                 "yyyy 年 MM 月 dd 日  HH 時 mm 分 ss 秒");  
  26.         SchedulerFactory sf = new StdSchedulerFactory();  
  27.         Scheduler sched = sf.getScheduler();  
  28.         System.out.println("--------------- 初始化 -------------------");  
  29.   
  30.         // 下一個10秒,不懂的去查API  
  31.         Date startTime = nextGivenSecondDate(null10);  
  32.   
  33.         // job1 第10秒執行一次,共執行5次  
  34.         JobDetail job1 = newJob(ColorJob.class).withIdentity("job1""group1")  
  35.                 .build();  
  36.   
  37.         SimpleTrigger trigger1 = newTrigger()  
  38.                 .withIdentity("trigger1""group1")  
  39.                 .startAt(startTime)  
  40.                 .withSchedule(  
  41.                         simpleSchedule().withIntervalInSeconds(10)  
  42.                                 .withRepeatCount(4)).build();  
  43.   
  44.         // 初始化傳入的參數  
  45.         job1.getJobDataMap().put(ColorJob.FAVORITE_COLOR, "######  綠   #####");  
  46.         job1.getJobDataMap().put(ColorJob.EXECUTION_COUNT, 1);  
  47.   
  48.         Date scheduleTime1 = sched.scheduleJob(job1, trigger1);  
  49.         System.out.println(job1.getKey().getName() + " 將在 : "  
  50.                 + dateFormat.format(scheduleTime1) + " 執行, 並重復 : "  
  51.                 + trigger1.getRepeatCount() + " 次, 每次間隔   "  
  52.                 + trigger1.getRepeatInterval() / 1000 + " 秒");  
  53.   
  54.         // job2 每10秒執行一次,共執行5次  
  55.         JobDetail job2 = newJob(ColorJob.class).withIdentity("job2""group1")  
  56.                 .build();  
  57.   
  58.         SimpleTrigger trigger2 = newTrigger()  
  59.                 .withIdentity("trigger2""group1")  
  60.                 .startAt(startTime)  
  61.                 .withSchedule(  
  62.                         simpleSchedule().withIntervalInSeconds(10)  
  63.                                 .withRepeatCount(4)).build();  
  64.   
  65.         // 初始化傳入的參數  
  66.         job2.getJobDataMap().put(ColorJob.FAVORITE_COLOR, "######  紅   #####");  
  67.         job2.getJobDataMap().put(ColorJob.EXECUTION_COUNT, 1);  
  68.   
  69.         Date scheduleTime2 = sched.scheduleJob(job2, trigger2);  
  70.         System.out.println(job2.getKey().getName() + " 將在 : "  
  71.                 + dateFormat.format(scheduleTime2) + " 執行, 並重復 : "  
  72.                 + trigger2.getRepeatCount() + " 次, 每次間隔   "  
  73.                 + trigger2.getRepeatInterval() / 1000 + " 秒");  
  74.   
  75.         System.out.println("------- 開始調度 (調用.start()方法) ----------------");  
  76.         sched.start();  
  77.   
  78.         System.out.println("------- 等待60秒 ... -------------");  
  79.         try {  
  80.             Thread.sleep(60L * 1000L);  
  81.         } catch (Exception e) {  
  82.         }  
  83.   
  84.         sched.shutdown(true);  
  85.         System.out.println("------- 調度已關閉 ---------------------");  
  86.   
  87.         // 顯示一下 已經執行的任務信息  
  88.         SchedulerMetaData metaData = sched.getMetaData();  
  89.         System.out.println("~~~~~~~~~~  執行了 "  
  90.                 + metaData.getNumberOfJobsExecuted() + " 個 jobs.");  
  91.   
  92.         /* 
  93.         如果你想在 某個job執行的時候傳入參數,參數在job執行過程中對參數有所修改,並且在job執行完畢後把參數返回 
  94.         那麼你需要學習一下現在的這個例子了,因爲它正是你所想要的 
  95.          */  
  96.     }  
  97.   
  98. }  


執行結果 :

[plain] view plaincopy
  1. --------------- 初始化 -------------------  
  2. job1 將在 : 2013 年 03 月 07 日  14 時 02 分 00 秒 執行, 並重復 : 4 次, 每次間隔   10 秒  
  3. job2 將在 : 2013 年 03 月 07 日  14 時 02 分 00 秒 執行, 並重復 : 4 次, 每次間隔   10 秒  
  4. ------- 開始調度 (調用.start()方法) ----------------  
  5. ------- 等待60秒 ... -------------  
  6. ColorJob: job2 在 2013 年 03 月 07 日  14 時 02 分 00 秒 執行了 ...    
  7.       喜歡的顏色是:  ######  紅   #####  
  8.       執行次數統計(from job jobDataMap): 1  
  9.       執行次數統計( from job 類的成員變 量 ): 1   
  10.    
  11. ColorJob: job1 在 2013 年 03 月 07 日  14 時 02 分 00 秒 執行了 ...    
  12.       喜歡的顏色是:  ######  綠   #####  
  13.       執行次數統計(from job jobDataMap): 1  
  14.       執行次數統計( from job 類的成員變 量 ): 1   
  15.    
  16. ColorJob: job1 在 2013 年 03 月 07 日  14 時 02 分 10 秒 執行了 ...    
  17.       喜歡的顏色是:  ######  綠   #####  
  18.       執行次數統計(from job jobDataMap): 2  
  19.       執行次數統計( from job 類的成員變 量 ): 1   
  20.    
  21. ColorJob: job2 在 2013 年 03 月 07 日  14 時 02 分 10 秒 執行了 ...    
  22.       喜歡的顏色是:  ######  紅   #####  
  23.       執行次數統計(from job jobDataMap): 2  
  24.       執行次數統計( from job 類的成員變 量 ): 1   
  25.    
  26. ColorJob: job1 在 2013 年 03 月 07 日  14 時 02 分 20 秒 執行了 ...    
  27.       喜歡的顏色是:  ######  綠   #####  
  28.       執行次數統計(from job jobDataMap): 3  
  29.       執行次數統計( from job 類的成員變 量 ): 1   
  30.    
  31. ColorJob: job2 在 2013 年 03 月 07 日  14 時 02 分 20 秒 執行了 ...    
  32.       喜歡的顏色是:  ######  紅   #####  
  33.       執行次數統計(from job jobDataMap): 3  
  34.       執行次數統計( from job 類的成員變 量 ): 1   
  35.    
  36. ColorJob: job1 在 2013 年 03 月 07 日  14 時 02 分 30 秒 執行了 ...    
  37.       喜歡的顏色是:  ######  綠   #####  
  38.       執行次數統計(from job jobDataMap): 4  
  39.       執行次數統計( from job 類的成員變 量 ): 1   
  40.    
  41. ColorJob: job2 在 2013 年 03 月 07 日  14 時 02 分 30 秒 執行了 ...    
  42.       喜歡的顏色是:  ######  紅   #####  
  43.       執行次數統計(from job jobDataMap): 4  
  44.       執行次數統計( from job 類的成員變 量 ): 1   
  45.    
  46. ColorJob: job1 在 2013 年 03 月 07 日  14 時 02 分 40 秒 執行了 ...    
  47.       喜歡的顏色是:  ######  綠   #####  
  48.       執行次數統計(from job jobDataMap): 5  
  49.       執行次數統計( from job 類的成員變 量 ): 1   
  50.    
  51. ColorJob: job2 在 2013 年 03 月 07 日  14 時 02 分 40 秒 執行了 ...    
  52.       喜歡的顏色是:  ######  紅   #####  
  53.       執行次數統計(from job jobDataMap): 5  
  54.       執行次數統計( from job 類的成員變 量 ): 1   
  55.    
  56. ------- 調度已關閉 ---------------------  
  57. ~~~~~~~~~~  執行了 10 個 jobs.  

 

說明 :

JobStateExample.java 類中 的 47/48 、68/69 行代碼 向JobDataMap 中放入值


ColorJob.java 類的 38-49 行對其進行了操作,然後又將參數放回到 JobDataMap中 

 對於單個任務來說:

  • 普通私有成員變量的操作不會影響到下次執行結果,_counter每次執行都是初始值1
  • JobDataMap容器中保存的favorite color 、count  可以保持狀態和參數傳遞

參數傳遞和狀態處理方式:

 1.參數傳遞。使用job.getJobDataMap().put()方式向Job當中傳遞參數,JobDataMap類實際上最終繼承了實現Map接口的"DirtyFlagMap"類,而DirtyFlagMap內部又保存了一個HashMap的引用,操作都是針對這個HashMap進行的。

2.JobDataMap的持久化 即PersistJobDataAfterExecution這個註解的使用。加上註解之後,每次執行完,JobDataMap都會被序列化,上次任務執行放入的值都會保存下來。

關於ColorJob.java   17/18  行的註解:

@PersistJobDataAfterExecution   保存在JobDataMap傳遞的參數

    
@DisallowConcurrentExecution   保證多個任務間不會同時執行.所以在多任務執行時最好加上

    英文好的可以 去看看這個 http://forums.terracotta.org/forums/posts/list/6777.page

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章