- 浏览: 2290802 次
- 性别:
- 来自: 成都
文章分类
- 全部博客 (357)
- J2EE (49)
- JavaScript (40)
- Spring (19)
- Struts (5)
- CSS (8)
- Hibernate (16)
- Java (67)
- DWR (4)
- JSON (3)
- XFIRE (1)
- Tomcat (1)
- Ant (2)
- 设计模式 (2)
- 经典收藏 (2)
- JSP (10)
- Linux (0)
- WebLogic (11)
- myeclipse (13)
- Buffalo (4)
- 文件上传相关 (1)
- oracle (33)
- html (6)
- JSTL (3)
- SVN (2)
- GIT (1)
- 孙卫琴(Java网络编程精解) (1)
- DOM4J (2)
- Swing (1)
- AJAX (1)
- Eclipse (5)
- 日志组件 (3)
- PowerDesigner (1)
- Jquery (22)
- IT技术开发相关网址 (1)
- Nutz (1)
- 其它 (1)
- Velocity (3)
- WebService (1)
- MySql (2)
- Android (1)
- Maven (2)
- Quartz (11)
- Lucene (1)
- springsource (1)
- Junit (1)
- Activiti (0)
最新评论
-
yzlseu:
拼凑,没有营养
Activiti进阶—分配组任务 -
zhangsenhao:
非常赞!代码很清楚
SpringMVC3.0+MyIbatis3.0(分页示例) -
xiamw2000:
分页写得不对,应该是 : order by ${orderNa ...
SpringMVC3.0+MyIbatis3.0(分页示例) -
sheertewtw:
...
SpringMVC:上传与下载 -
kingtoon:
...
XSS之xssprotect
Quartz之JobDataMap,PersistJobDataAfterExecution,DisallowConcurrentExecution
参考资料
http://stackoverflow.com/questions/1636556/ensure-that-spring-quartz-job-execution-doesnt-overlap
JobDataMap:任务数据传输对象,并且以Map形式存储,它重载了:putAsString()方法,如下图:
,类说明如下:
它继承了父类:StringKeyDirtyFlagMap,它重载了方法:put()方法,如下图:
,类说明如下:
以下这个示例用到了Quartz的二个注解,其实它推荐我们使用这二个注解.在这篇文章中作了如下说明:
以下这二个注解是我根据字面上的意思理解的呀
@PersistJobDataAfterExecution:保存在JobDataMap传递的参数,当你要一个计数器的时候,详情可参见以下这个例子.
@DisallowConcurrentExecution:保证多个任务间不会同时执行.所以在多任务执行时最好加上
具体参见代码(你可反复测试效果就知道了 ),详情请参见注解
ColorJob.java
JobStateExample .java
输出结果如下:
src下的log4j的日志级别设置成了error
log4j.xml
http://stackoverflow.com/questions/1636556/ensure-that-spring-quartz-job-execution-doesnt-overlap
JobDataMap:任务数据传输对象,并且以Map形式存储,它重载了:putAsString()方法,如下图:
,类说明如下:
JobDataMap instances are stored once when the Job is added to a scheduler. They are also re-persisted after every execution of StatefulJob instances. 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. 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()方法,如下图:
,类说明如下:
An implementation of Map that wraps another Map and flags itself 'dirty' when it is modified, enforces that all keys are Strings. All allowsTransientData flag related methods are deprecated as of version 1.6.,可以说:JobDataMap这个对象可以向任务传递任何对象.
以下这个示例用到了Quartz的二个注解,其实它推荐我们使用这二个注解.在这篇文章中作了如下说明:
以下这二个注解是我根据字面上的意思理解的呀
@PersistJobDataAfterExecution:保存在JobDataMap传递的参数,当你要一个计数器的时候,详情可参见以下这个例子.
@DisallowConcurrentExecution:保证多个任务间不会同时执行.所以在多任务执行时最好加上
具体参见代码(你可反复测试效果就知道了 ),详情请参见注解
ColorJob.java
package org.quartz.examples.example4; import java.text.SimpleDateFormat; import java.util.Date; import org.quartz.DisallowConcurrentExecution; import org.quartz.Job; import org.quartz.JobDataMap; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.quartz.JobKey; import org.quartz.PersistJobDataAfterExecution; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @PersistJobDataAfterExecution @DisallowConcurrentExecution public class ColorJob implements Job { private static Logger _log = LoggerFactory.getLogger(ColorJob.class); public static final String FAVORITE_COLOR = "favorite color"; public static final String EXECUTION_COUNT = "count"; //这个属性如不是static,那么每次都要实例这个任务类,始终打印为: 1 private static int _counter = 1; public ColorJob() { } public void execute(JobExecutionContext context) throws JobExecutionException { JobKey jobKey = context.getJobDetail().getKey(); JobDataMap data = context.getJobDetail().getJobDataMap(); String favoriteColor = data.getString(FAVORITE_COLOR); int count = data.getInt(EXECUTION_COUNT); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); _log.error("任务Key: " + jobKey + " ,执行时间: " + sdf.format(new Date()) + "\n" + " 传递参数(favorite color): " + favoriteColor + "\n" + " 传递参数(count): " + count + "\n" + " ColorJob静态变量值: " + _counter); count++; data.put(EXECUTION_COUNT, count); _counter++; } }
JobStateExample .java
package org.quartz.examples.example4; import static org.quartz.JobBuilder.newJob; import static org.quartz.SimpleScheduleBuilder.simpleSchedule; import static org.quartz.TriggerBuilder.newTrigger; import static org.quartz.DateBuilder.*; import java.text.SimpleDateFormat; import java.util.Date; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerFactory; import org.quartz.SchedulerMetaData; import org.quartz.SimpleTrigger; import org.quartz.impl.StdSchedulerFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class JobStateExample { public void run() throws Exception { Logger log = LoggerFactory.getLogger(JobStateExample.class); SchedulerFactory sf = new StdSchedulerFactory(); Scheduler sched = sf.getScheduler(); //在当前时间10秒后运行 Date startTime = nextGivenSecondDate(null, 10); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); //通过过JobDetail封装ColorJob,同时指定Job在Scheduler中所属组及名称,这里,组名为group1,而名称为job1。 JobDetail job1 = newJob(ColorJob.class) .withIdentity("job1", "group1") .build(); // 创建一个SimpleTrigger实例,指定该Trigger在Scheduler中所属组及名称。 // 接着设置调度的时间规则.当前时间10秒后运行,每10秒运行一次,共运行4次 SimpleTrigger trigger1 = newTrigger() .withIdentity("trigger1", "group1") .startAt(startTime) .withSchedule(simpleSchedule() .withIntervalInSeconds(10) .withRepeatCount(4)) .build(); //将参数传递入任务的数据Map中 job1.getJobDataMap().put(ColorJob.FAVORITE_COLOR, "Green"); job1.getJobDataMap().put(ColorJob.EXECUTION_COUNT, 1); //注册并进行调度 Date scheduleTime1 = sched.scheduleJob(job1, trigger1); log.error("任务key: "+job1.getKey() + ",执行运行时间: " + sdf.format(scheduleTime1) + ",触发器重复执行次数: " + trigger1.getRepeatCount() + ",触发器执行时间: " + trigger1.getRepeatInterval() / 1000 + " seconds"); //第二个任务 JobDetail job2 = newJob(ColorJob.class) .withIdentity("job2", "group1") .build(); SimpleTrigger trigger2 = newTrigger() .withIdentity("trigger2", "group1") .startAt(startTime) .withSchedule(simpleSchedule() .withIntervalInSeconds(10) .withRepeatCount(4)) .build(); //传递数据 job2.getJobDataMap().put(ColorJob.FAVORITE_COLOR, "Red"); job2.getJobDataMap().put(ColorJob.EXECUTION_COUNT, 1); Date scheduleTime2 = sched.scheduleJob(job2, trigger2); log.error("第二个任务key: "+job2.getKey().toString() + ",执行运行时间: " + sdf.format(scheduleTime2) + ",触发器重复执行次数: " + trigger2.getRepeatCount() + ",触发器执行时间: " + trigger2.getRepeatInterval() / 1000 + " seconds"); //调度器启动 sched.start(); try { Thread.sleep(60L * 1000L); } catch (Exception e) { } //调度器停止 sched.shutdown(true); SchedulerMetaData metaData = sched.getMetaData(); log.error("Executed " + metaData.getNumberOfJobsExecuted() + " jobs."); } public static void main(String[] args) throws Exception { JobStateExample example = new JobStateExample(); example.run(); } }
输出结果如下:
[ERROR] 2011-08-10 02:56:44.453 下午 main [org.quartz.examples.example4.JobStateExample] 任务key: group1.job1,执行运行时间: 2011-08-10 02:56:50,触发器重复执行次数: 4,触发器执行时间: 10 seconds [ERROR] 2011-08-10 02:56:44.453 下午 main [org.quartz.examples.example4.JobStateExample] 第二个任务key: group1.job2,执行运行时间: 2011-08-10 02:56:50,触发器重复执行次数: 4,触发器执行时间: 10 seconds [ERROR] 2011-08-10 02:56:50.015 下午 DefaultQuartzScheduler_Worker-1 [org.quartz.examples.example4.ColorJob] 任务Key: group1.job1 ,执行时间: 2011-08-10 02:56:50 传递参数(favorite color): Green 传递参数(count): 1 ColorJob静态变量值: 1 [ERROR] 2011-08-10 02:56:50.015 下午 DefaultQuartzScheduler_Worker-2 [org.quartz.examples.example4.ColorJob] 任务Key: group1.job2 ,执行时间: 2011-08-10 02:56:50 传递参数(favorite color): Red 传递参数(count): 1 ColorJob静态变量值: 1 [ERROR] 2011-08-10 02:57:00.000 下午 DefaultQuartzScheduler_Worker-4 [org.quartz.examples.example4.ColorJob] 任务Key: group1.job2 ,执行时间: 2011-08-10 02:57:00 传递参数(favorite color): Red 传递参数(count): 2 ColorJob静态变量值: 3 [ERROR] 2011-08-10 02:57:00.000 下午 DefaultQuartzScheduler_Worker-3 [org.quartz.examples.example4.ColorJob] 任务Key: group1.job1 ,执行时间: 2011-08-10 02:57:00 传递参数(favorite color): Green 传递参数(count): 2 ColorJob静态变量值: 3 [ERROR] 2011-08-10 02:57:10.000 下午 DefaultQuartzScheduler_Worker-5 [org.quartz.examples.example4.ColorJob] 任务Key: group1.job1 ,执行时间: 2011-08-10 02:57:10 传递参数(favorite color): Green 传递参数(count): 3 ColorJob静态变量值: 5 [ERROR] 2011-08-10 02:57:10.000 下午 DefaultQuartzScheduler_Worker-6 [org.quartz.examples.example4.ColorJob] 任务Key: group1.job2 ,执行时间: 2011-08-10 02:57:10 传递参数(favorite color): Red 传递参数(count): 3 ColorJob静态变量值: 5 [ERROR] 2011-08-10 02:57:20.000 下午 DefaultQuartzScheduler_Worker-7 [org.quartz.examples.example4.ColorJob] 任务Key: group1.job1 ,执行时间: 2011-08-10 02:57:20 传递参数(favorite color): Green 传递参数(count): 4 ColorJob静态变量值: 7 [ERROR] 2011-08-10 02:57:20.000 下午 DefaultQuartzScheduler_Worker-8 [org.quartz.examples.example4.ColorJob] 任务Key: group1.job2 ,执行时间: 2011-08-10 02:57:20 传递参数(favorite color): Red 传递参数(count): 4 ColorJob静态变量值: 7 [ERROR] 2011-08-10 02:57:30.000 下午 DefaultQuartzScheduler_Worker-9 [org.quartz.examples.example4.ColorJob] 任务Key: group1.job1 ,执行时间: 2011-08-10 02:57:30 传递参数(favorite color): Green 传递参数(count): 5 ColorJob静态变量值: 9 [ERROR] 2011-08-10 02:57:30.000 下午 DefaultQuartzScheduler_Worker-10 [org.quartz.examples.example4.ColorJob] 任务Key: group1.job2 ,执行时间: 2011-08-10 02:57:30 传递参数(favorite color): Red 传递参数(count): 5 ColorJob静态变量值: 10 [ERROR] 2011-08-10 02:57:44.453 下午 main [org.quartz.examples.example4.JobStateExample] Executed 10 jobs.
src下的log4j的日志级别设置成了error
log4j.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> <appender name="default" class="org.apache.log4j.ConsoleAppender"> <param name="target" value="System.out"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="[%p] %d{yyyy-MM-dd hh:mm:ss.SSS aa} %t [%c]%n%m%n%n"/> </layout> </appender> <logger name="org.quartz"> <level value="error" /> </logger> <root> <level value="info" /> <appender-ref ref="default" /> </root> </log4j:configuration>
发表评论
-
java json-lib & jQuery & jsonp
2016-06-30 11:31 834参考链接: 1、http://hanqunfeng.iteye ... -
随机分配算法(Intege)
2016-01-08 13:05 5205参考资料: http://blog.csdn.net/yaer ... -
XSS之xssprotect
2012-12-07 23:03 29498参考资料 1 跨网站脚本 ... -
Java之Thread(线程题)
2011-10-31 12:33 1980特别说明:java线程相关的参考了张孝祥老师的代码 参考资料 ... -
Java之ThreadLocal(Synchronized)
2011-10-31 10:10 2698参考资料 1 深入研究java.lang.ThreadLoca ... -
Java之synchronized,wait,notify结合运用示例
2011-10-26 11:54 5941场景一:要求二个线程各 ... -
Java之synchronized深入应用
2011-10-23 08:03 1950参考资料 1 java synchronized详解 http ... -
Java之Timer入门
2011-10-11 15:32 1700参考资料 1 java中timer用 ... -
Java之线程(匿名内部类)
2011-10-10 16:36 164421 Thread对象 Thread t = new Thr ... -
Java之线程(join)
2011-10-10 15:39 1487运用场景:多个线程之间 ... -
Java之线程(synchronized,wait(),notify(),notifyAll())
2011-10-10 15:03 3259参考资料 Java多线程入门大全(适用于有一定基础者) htt ... -
Java之线程(sleep,线程名)
2011-10-10 13:09 9720参考资料 1 Java线程:创建与启动 http://lava ... -
Java之线程入门
2011-10-10 11:11 1540参考资料 1 Java线程:概 ... -
java之表反向生成类
2011-09-23 16:41 3489环境:XP+JDK1.5+Oracle10g 注意事项 1 请 ... -
java之线程, NIO学习资料
2011-09-19 12:13 1138Concurrent In Java 6 第一部分 集合 ... -
Java之BigDecimal
2011-09-15 10:12 18038参考资料 1 java.math.BigDecimal的用法 ... -
java.lang.OutOfMemoryError异常解决方法
2011-08-27 16:47 2117转载:java.lang.OutOfMemoryError异常 ... -
Jcom之jp.ne.so_net.ga2.no_ji.jcom.JComException: createInstance() failed HRESULT=
2011-08-25 12:33 11751参考资料 java应用jcom将word转pdf http:/ ... -
Quartz之一个任务绑定多个触发器
2011-08-15 16:27 5031参见官方示例: SchedulerFactory sf = ... -
Quartz之QuartzInitializerListener
2011-08-15 15:12 7925问题:我想在WEB容器启动时就执行任务怎么办呢 Quartz: ...
相关推荐
在本文中,我们将深入探讨如何使用`@PersistJobDataAfterExecution`和`@DisallowConcurrentExecution`注解来通过JobDataMap向Quartz 2调度的任务传递参数。 首先,`JobDataMap`是Quartz 2提供的一种机制,用于在...
- 利用`@DisallowConcurrentExecution`或`@PersistJobDataAfterExecution`注解控制Job的行为。 3. **quartz.sql和sql.txt** - `quartz.sql`:这是Quartz用于创建其内部工作表的SQL脚本,这些表存储了Job、Trigger...
3. **申明式调度** - 通过使用`@DisallowConcurrentExecution`和`@PersistJobDataAfterExecution`注解,可以在Job类上声明执行行为。同时,可以使用`@Scheduled`注解在方法上直接定义调度。 4. **使用`quartz....
在Spring Boot中,你可以通过实现`org.springframework.scheduling.quartz.JobDetailBean`并使用`@DisallowConcurrentExecution`或`@PersistJobDataAfterExecution`注解来创建可重入或持久化的Job类。例如: ```...
开发者需要创建Job的实现类,并通过`@DisallowConcurrentExecution`或`@PersistJobDataAfterExecution`注解来定义其并发行为和数据持久化需求。 - **Trigger**:Trigger则定义了Job的执行时间。Quartz提供了多种...
- 使用`@DisallowConcurrentExecution`或`@PersistJobDataAfterExecution`注解,控制Job实例的并发执行策略和数据持久化。 3. **Trigger的配置**: - **CronTrigger**:使用cron表达式定义执行时间,例如"0 0/5 *...
这包括使用`@DisallowConcurrentExecution`和`@PersistJobDataAfterExecution`注解来控制Job的行为,以及使用`@Scheduled`注解来声明基于Cron的定时任务。 总结起来,"Quartz-demo"是一个实践Quartz任务调度的实例...
- Spring为Quartz提供了良好的整合,允许你直接在Spring Bean中定义Job,通过`@Component`注解并使用`@DisallowConcurrentExecution`和`@PersistJobDataAfterExecution`注解。 - 可以使用`@Scheduled`注解来创建...
在实际应用中,Quartz可以与其他框架或技术结合,例如Spring框架中的`@DisallowConcurrentExecution`和`@PersistJobDataAfterExecution`注解,可以控制Job的并发执行和数据持久化。通过这些特性,开发者可以构建出...
2. **@PersistJobDataAfterExecution**: 这个注解表示在Job执行完成后,更新的JobDataMap数据应当持久化。这意味着在下次执行时,Job可以访问到上次执行时设置的数据。 3. **@DisallowConcurrentExecution** 和 **@...
5. **JobDataMap**:存储 Job 执行时所需的数据,可以在 Job 中通过 `@DisallowConcurrentExecution` 或 `@PersistJobDataAfterExecution` 注解控制并发行为。 通过阅读 `src` 中的源代码,你可以了解到作者是如何...
- 使用`@Component`注解定义Job类,然后通过`@DisallowConcurrentExecution`或`@PersistJobDataAfterExecution`控制Job的行为。 - 使用`@Configuration`类创建bean,通过`SchedulerFactoryBean`的`addJob`和`...
使用 @DisallowConcurrentExecution 注解可以确保同一时间仅有一个任务实例在执行,而 @PersistJobDataAfterExecution 注解会在任务成功执行后更新 JobDataMap,使下次执行时能获取最新的数据。这两种注解都作用于 ...
4. **Spring整合Quartz**: 在Spring中,我们可以使用`@Component`注解声明Job类,并通过`@DisallowConcurrentExecution`或`@PersistJobDataAfterExecution`控制Job的行为。通过Spring的`SchedulerFactoryBean`,我们...
- 通过`@DisallowConcurrentExecution`和`@PersistJobDataAfterExecution`注解控制Job的行为。 7. **实战应用** - 定时发送邮件或短信服务。 - 数据库定时清理、备份任务。 - 日常业务统计报告的自动化生成。 ...