分享

Quartz之JobDataMap,PersistJobDataAfterExecution,DisallowConcurrentExecution

 freety 2013-10-14
     参考资料
http:///questions/1636556/ensure-that-spring-quartz-job-execution-doesnt-overlap

JobDataMap:任务数据传输对象,并且以Map形式存储,它重载了:putAsString()方法,如下图:
,类说明如下:
Java代码  收藏代码
  1. JobDataMap instances are stored once when the Job is added to a scheduler. They are also re-persisted after every execution of StatefulJob instances.  
  2. JobDataMap instances can also be stored with a Trigger. This can be useful in the case where you have a Job that is stored in the scheduler for regular/repeated use by multiple Triggers, yet with each independent triggering, you want to supply the Job with different data inputs.  
  3. The JobExecutionContext passed to a Job at execution time also contains a convenience JobDataMap that is the result of merging the contents of the trigger's JobDataMap (if any) over the Job's JobDataMap (if any).   

它继承了父类:StringKeyDirtyFlagMap,它重载了方法:put()方法,如下图:
,类说明如下:
Java代码  收藏代码
  1. An implementation of Map that wraps another Map and flags itself 'dirty' when it is modified, enforces that all keys are Strings.  
  2. All allowsTransientData flag related methods are deprecated as of version 1.6.   
,可以说:JobDataMap这个对象可以向任务传递任何对象.
以下这个示例用到了Quartz的二个注解,其实它推荐我们使用这二个注解.在这篇文章中作了如下说明:

以下这二个注解是我根据字面上的意思理解的呀
@PersistJobDataAfterExecution:保存在JobDataMap传递的参数,当你要一个计数器的时候,详情可参见以下这个例子.
@DisallowConcurrentExecution:保证多个任务间不会同时执行.所以在多任务执行时最好加上

具体参见代码(你可反复测试效果就知道了 ),详情请参见注解
ColorJob.java
Java代码  收藏代码
  1. package org.quartz.examples.example4;  
  2.   
  3. import java.text.SimpleDateFormat;  
  4. import java.util.Date;  
  5. import org.quartz.DisallowConcurrentExecution;  
  6. import org.quartz.Job;  
  7. import org.quartz.JobDataMap;  
  8. import org.quartz.JobExecutionContext;  
  9. import org.quartz.JobExecutionException;  
  10. import org.quartz.JobKey;  
  11. import org.quartz.PersistJobDataAfterExecution;  
  12. import org.slf4j.Logger;  
  13. import org.slf4j.LoggerFactory;  
  14.   
  15. @PersistJobDataAfterExecution  
  16. @DisallowConcurrentExecution  
  17. public class ColorJob implements Job {  
  18.   
  19.     private static Logger _log = LoggerFactory.getLogger(ColorJob.class);      
  20.      
  21.     public static final String FAVORITE_COLOR = "favorite color";  
  22.     public static final String EXECUTION_COUNT = "count";      
  23.      
  24.     //这个属性如不是static,那么每次都要实例这个任务类,始终打印为: 1  
  25.     private static  int _counter = 1;  
  26.      
  27.     public ColorJob() {  
  28.     }    
  29.     public void execute(JobExecutionContext context)  
  30.         throws JobExecutionException {  
  31.   
  32.         
  33.         JobKey jobKey = context.getJobDetail().getKey();          
  34.          
  35.         JobDataMap data = context.getJobDetail().getJobDataMap();  
  36.         String favoriteColor = data.getString(FAVORITE_COLOR);  
  37.         int count = data.getInt(EXECUTION_COUNT);  
  38.           
  39.         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");          
  40.           
  41.         _log.error("任务Key: " + jobKey + " ,执行时间:  " + sdf.format(new Date()) + "\n" +  
  42.             "  传递参数(favorite color): " + favoriteColor + "\n" +   
  43.             "  传递参数(count):  " + count + "\n" +   
  44.             "  ColorJob静态变量值: " + _counter);  
  45.        
  46.         count++;  
  47.         data.put(EXECUTION_COUNT, count);          
  48.         
  49.         _counter++;  
  50.     }  
  51. }  

JobStateExample .java
Java代码  收藏代码
  1. package org.quartz.examples.example4;  
  2.   
  3. import static org.quartz.JobBuilder.newJob;  
  4. import static org.quartz.SimpleScheduleBuilder.simpleSchedule;  
  5. import static org.quartz.TriggerBuilder.newTrigger;  
  6. import static org.quartz.DateBuilder.*;  
  7.   
  8. import java.text.SimpleDateFormat;  
  9. import java.util.Date;  
  10.   
  11. import org.quartz.JobDetail;  
  12. import org.quartz.Scheduler;  
  13. import org.quartz.SchedulerFactory;  
  14. import org.quartz.SchedulerMetaData;  
  15. import org.quartz.SimpleTrigger;  
  16. import org.quartz.impl.StdSchedulerFactory;  
  17. import org.slf4j.Logger;  
  18. import org.slf4j.LoggerFactory;  
  19.   
  20. public class JobStateExample {  
  21.   
  22.     public void run() throws Exception {  
  23.           
  24.         Logger log = LoggerFactory.getLogger(JobStateExample.class);  
  25.         SchedulerFactory sf = new StdSchedulerFactory();  
  26.         Scheduler sched = sf.getScheduler();  
  27.   
  28.         //在当前时间10秒后运行  
  29.         Date startTime = nextGivenSecondDate(null, 10);  
  30.         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");          
  31.          
  32.   
  33.         //通过过JobDetail封装ColorJob,同时指定Job在Scheduler中所属组及名称,这里,组名为group1,而名称为job1。  
  34.         JobDetail job1 = newJob(ColorJob.class)  
  35.             .withIdentity("job1", "group1")  
  36.             .build();  
  37.       
  38.        // 创建一个SimpleTrigger实例,指定该Trigger在Scheduler中所属组及名称。  
  39.        // 接着设置调度的时间规则.当前时间10秒后运行,每10秒运行一次,共运行4次  
  40.         SimpleTrigger trigger1 = newTrigger()   
  41.             .withIdentity("trigger1", "group1")  
  42.             .startAt(startTime)  
  43.             .withSchedule(simpleSchedule()  
  44.                     .withIntervalInSeconds(10)  
  45.                     .withRepeatCount(4))  
  46.             .build();  
  47.           
  48.         //将参数传递入任务的数据Map中  
  49.         job1.getJobDataMap().put(ColorJob.FAVORITE_COLOR, "Green");  
  50.         job1.getJobDataMap().put(ColorJob.EXECUTION_COUNT, 1);  
  51.           
  52.         //注册并进行调度  
  53.         Date scheduleTime1 = sched.scheduleJob(job1, trigger1);  
  54.           
  55.         log.error("任务key: "+job1.getKey() + ",执行运行时间: " + sdf.format(scheduleTime1) +    
  56.                 ",触发器重复执行次数: " + trigger1.getRepeatCount() +   
  57.                 ",触发器执行时间: " + trigger1.getRepeatInterval() / 1000 + " seconds");  
  58.           
  59.   
  60.         //第二个任务  
  61.         JobDetail job2 = newJob(ColorJob.class)  
  62.             .withIdentity("job2", "group1")  
  63.             .build();  
  64.       
  65.         SimpleTrigger trigger2 = newTrigger()   
  66.             .withIdentity("trigger2", "group1")  
  67.             .startAt(startTime)  
  68.             .withSchedule(simpleSchedule()  
  69.                     .withIntervalInSeconds(10)  
  70.                     .withRepeatCount(4))  
  71.             .build();  
  72.   
  73.         //传递数据  
  74.         job2.getJobDataMap().put(ColorJob.FAVORITE_COLOR, "Red");  
  75.         job2.getJobDataMap().put(ColorJob.EXECUTION_COUNT, 1);  
  76.           
  77.          
  78.         Date scheduleTime2 = sched.scheduleJob(job2, trigger2);  
  79.           
  80.         log.error("第二个任务key: "+job2.getKey().toString() + ",执行运行时间: " + sdf.format(scheduleTime2) +    
  81.                 ",触发器重复执行次数: " + trigger2.getRepeatCount() +   
  82.                 ",触发器执行时间: " + trigger2.getRepeatInterval() / 1000 + " seconds");  
  83.   
  84.   
  85.         //调度器启动  
  86.         sched.start();  
  87.   
  88.         try {            
  89.             Thread.sleep(60L * 1000L);            
  90.         } catch (Exception e) {           
  91.         }  
  92.   
  93.       //调度器停止  
  94.         sched.shutdown(true);  
  95.           
  96.         SchedulerMetaData metaData = sched.getMetaData();  
  97.         log.error("Executed " + metaData.getNumberOfJobsExecuted() + " jobs.");  
  98.   
  99.     }  
  100.   
  101.     public static void main(String[] args) throws Exception {  
  102.   
  103.         JobStateExample example = new JobStateExample();  
  104.         example.run();  
  105.     }  
  106. }  

输出结果如下:
Java代码  收藏代码
  1. [ERROR] 2011-08-10 02:56:44.453 下午 main [org.quartz.examples.example4.JobStateExample]  
  2. 任务key: group1.job1,执行运行时间: 2011-08-10 02:56:50,触发器重复执行次数: 4,触发器执行时间: 10 seconds  
  3.   
  4. [ERROR] 2011-08-10 02:56:44.453 下午 main [org.quartz.examples.example4.JobStateExample]  
  5. 第二个任务key: group1.job2,执行运行时间: 2011-08-10 02:56:50,触发器重复执行次数: 4,触发器执行时间: 10 seconds  
  6.   
  7. [ERROR] 2011-08-10 02:56:50.015 下午 DefaultQuartzScheduler_Worker-1 [org.quartz.examples.example4.ColorJob]  
  8. 任务Key: group1.job1 ,执行时间:  2011-08-10 02:56:50  
  9.   传递参数(favorite color): Green  
  10.   传递参数(count):  1  
  11.   ColorJob静态变量值: 1  
  12.   
  13. [ERROR] 2011-08-10 02:56:50.015 下午 DefaultQuartzScheduler_Worker-2 [org.quartz.examples.example4.ColorJob]  
  14. 任务Key: group1.job2 ,执行时间:  2011-08-10 02:56:50  
  15.   传递参数(favorite color): Red  
  16.   传递参数(count):  1  
  17.   ColorJob静态变量值: 1  
  18.   
  19. [ERROR] 2011-08-10 02:57:00.000 下午 DefaultQuartzScheduler_Worker-4 [org.quartz.examples.example4.ColorJob]  
  20. 任务Key: group1.job2 ,执行时间:  2011-08-10 02:57:00  
  21.   传递参数(favorite color): Red  
  22.   传递参数(count):  2  
  23.   ColorJob静态变量值: 3  
  24.   
  25. [ERROR] 2011-08-10 02:57:00.000 下午 DefaultQuartzScheduler_Worker-3 [org.quartz.examples.example4.ColorJob]  
  26. 任务Key: group1.job1 ,执行时间:  2011-08-10 02:57:00  
  27.   传递参数(favorite color): Green  
  28.   传递参数(count):  2  
  29.   ColorJob静态变量值: 3  
  30.   
  31. [ERROR] 2011-08-10 02:57:10.000 下午 DefaultQuartzScheduler_Worker-5 [org.quartz.examples.example4.ColorJob]  
  32. 任务Key: group1.job1 ,执行时间:  2011-08-10 02:57:10  
  33.   传递参数(favorite color): Green  
  34.   传递参数(count):  3  
  35.   ColorJob静态变量值: 5  
  36.   
  37. [ERROR] 2011-08-10 02:57:10.000 下午 DefaultQuartzScheduler_Worker-6 [org.quartz.examples.example4.ColorJob]  
  38. 任务Key: group1.job2 ,执行时间:  2011-08-10 02:57:10  
  39.   传递参数(favorite color): Red  
  40.   传递参数(count):  3  
  41.   ColorJob静态变量值: 5  
  42.   
  43. [ERROR] 2011-08-10 02:57:20.000 下午 DefaultQuartzScheduler_Worker-7 [org.quartz.examples.example4.ColorJob]  
  44. 任务Key: group1.job1 ,执行时间:  2011-08-10 02:57:20  
  45.   传递参数(favorite color): Green  
  46.   传递参数(count):  4  
  47.   ColorJob静态变量值: 7  
  48.   
  49. [ERROR] 2011-08-10 02:57:20.000 下午 DefaultQuartzScheduler_Worker-8 [org.quartz.examples.example4.ColorJob]  
  50. 任务Key: group1.job2 ,执行时间:  2011-08-10 02:57:20  
  51.   传递参数(favorite color): Red  
  52.   传递参数(count):  4  
  53.   ColorJob静态变量值: 7  
  54.   
  55. [ERROR] 2011-08-10 02:57:30.000 下午 DefaultQuartzScheduler_Worker-9 [org.quartz.examples.example4.ColorJob]  
  56. 任务Key: group1.job1 ,执行时间:  2011-08-10 02:57:30  
  57.   传递参数(favorite color): Green  
  58.   传递参数(count):  5  
  59.   ColorJob静态变量值: 9  
  60.   
  61. [ERROR] 2011-08-10 02:57:30.000 下午 DefaultQuartzScheduler_Worker-10 [org.quartz.examples.example4.ColorJob]  
  62. 任务Key: group1.job2 ,执行时间:  2011-08-10 02:57:30  
  63.   传递参数(favorite color): Red  
  64.   传递参数(count):  5  
  65.   ColorJob静态变量值: 10  
  66.   
  67. [ERROR] 2011-08-10 02:57:44.453 下午 main [org.quartz.examples.example4.JobStateExample]  
  68. Executed 10 jobs.  

src下的log4j的日志级别设置成了error
log4j.xml
Xml代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">  
  3. <log4j:configuration xmlns:log4j="http://jakarta./log4j/">  
  4.   
  5.   <appender name="default" class="org.apache.log4j.ConsoleAppender">  
  6.     <param name="target" value="System.out"/>  
  7.     <layout class="org.apache.log4j.PatternLayout">  
  8.       <param name="ConversionPattern" value="[%p] %d{yyyy-MM-dd hh:mm:ss.SSS aa} %t [%c]%n%m%n%n"/>  
  9.     </layout>  
  10.   </appender>  
  11.   
  12.  <logger name="org.quartz">  
  13.    <level value="error" />  
  14.  </logger>  
  15.   
  16.   <root>  
  17.     <level value="info" />  
  18.     <appender-ref ref="default" />  
  19.   </root>    
  20. </log4j:configuration>  

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多