`
yimeng528
  • 浏览: 183873 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Quartz之JobDataMap,PersistJobDataAfterExecution,DisallowConcurrentExecution

阅读更多
参考资料 
http://stackoverflow.com/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(null10);  
  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.apache.org/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>  
分享到:
评论

相关推荐

    Quartz2.2.1深入Job、JobDetail、JobDataMap、Trigger

    Quartz2.2.1深入Job、JobDetail、JobDataMap、Trigger ,具体效果和过程看博文:http://blog.csdn.net/evankaka/article/details/45361759

    java 任务分配样例3

    java 任务分配样例 In this page we will walk through Quartz 2 scheduler passing parameters to Job with JobDataMap using @PersistJobDataAfterExecution and @DisallowConcurrentExecution example.

    quartz-2.3.2-API文档-中文版.zip

    赠送jar包:quartz-2.3.2.jar; 赠送原API文档:quartz-2.3.2-javadoc.jar; 赠送源代码:quartz-2.3.2-sources.jar; 赠送Maven依赖信息文件:quartz-2.3.2.pom; 包含翻译后的API文档:quartz-2.3.2-javadoc-API...

    quartz指南,Quartz 工程

    文件里面包括 1:Quartz开发指南.pdf 2:Quartz从入门到进阶.pdf 3:QuartzBeginnerExample一个附带的工程例子 4:quartz-1.6.1.zip Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它...

    quartz-1.6.0.jar和quartz-all-1.6.0.jar

    该压缩包内包含两个quartz的jar包, 分别是quartz-1.6.0.jar和quartz-all-1.6.0.jar

    quartz-2.3.0-API文档-中文版.zip

    赠送jar包:quartz-2.3.0.jar; 赠送原API文档:quartz-2.3.0-javadoc.jar; 赠送源代码:quartz-2.3.0-sources.jar; 赠送Maven依赖信息文件:quartz-2.3.0.pom; 包含翻译后的API文档:quartz-2.3.0-javadoc-API...

    quartz-2.1.1 完整源码

    QTZ-197 - JobDataMap has had improvements made to its interface w/respect to generics QTZ-184 - GroupMatcher API changes to avoid generics compiler warnings New Features QTZ-196 - New trigger type '...

    quartz-2.2.3版本的quartz初始化sql语句

    quartz-2.2.3版本的quartz初始化sql语句

    Autofac.Extras.Quartz, Quartz.Net的Autofac集成.zip

    Autofac.Extras.Quartz, Quartz.Net的Autofac集成 Autofac.Extras.Quartz用于 Quartz.Net的Autofac集成包。Autofac.Extras.Quartz 为每个石英作业创建嵌套的litefime作用域。 完成作业执行后释放嵌套作用域。这允许...

    自开发实现Quartz Web管理工具

    网上能找到的Quartz Web管理的资料都是使用的一个国外人写的Quartz WebApp的东东,功能也很全面。但是作为自己的应用其实用不了那么多功能,一般我们只要可以定义一个job,指定一个Cron表达式完成工作即可,附带的...

    quartz简单实例quartz简单实例

    quartz简单实例quartz简单实例quartz简单实例quartz简单实例

    quartz quartz-1.8.6 dbTables 建表sql

    quartz quartz-1.8.6 dbTables quartz动态任务调度需要的数据库脚本。

    postgres-quartz.sql

    postgres quatrz初始化sql脚本文件、pg、quartz、qrtz_开头的表 配置文件需求修改 #org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate org.quartz.jobStore....

    quartz内部表.sql

    quartz内部表.sql。

    Quartz之CronExpression详解

    详细介绍CronExpression表达式设定定时任务的规则

    quartz1.5,quartz1.6,quartz1.8

    Quartz1.5,Quartz1.6,Quartz1.8。Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个...

    Quartz.NET-2.0

    Quartz.NET框架的核心是调度器。调度器负责管理Quartz.NET应用运行时环境。Quartz不仅仅是线程和线程管理。为确保可伸缩性,Quartz.NET采用了基于多线程的架构。启动时,框架初始化一套worker线程,这套线程被调度器...

    Quartz原理及实例

    Quartz原理及实例,spring4.x+Quartz.2.2.1结合的开发,静态和动态实例

    关于spring中quartz的配置

    关于spring中quartz的配置

    lucene与quartz例子

    lucene quartz 例子lucene quartz 例子lucene quartz 例子lucene quartz 例子lucene quartz 例子lucene quartz 例子lucene quartz 例子lucene quartz 例子lucene quartz 例子lucene quartz 例子

Global site tag (gtag.js) - Google Analytics