Quartz入门例子简介 从入门到菜鸟(四)
来源:互联网 发布:手机移动数据怎么关闭 编辑:程序博客网 时间:2024/05/24 00:53
忙了两天 补充一下姿势。
这次讲Quartz中Job的参数传递和状态保存。
先贴代码,还是两个类:
任务定义: MyParaJob.java
接下来是进度调用: QuartzParaTest.java
任务目的简单讲解一下:本例子在任务开始时,从调度器通过JobDataMap向任务里面射入了一个int值,执行时发现对于单个任务来说:
在2.0之前,Quartz对类似有状态的任务处理方式是需要实现StatefulJob这个接口的,并且
引用自:http://blog.csdn.net/ychatou1220/article/details/5807108
当然 这只是前面版本的处理,2.0之后StatefulJob接口直接被deprecated了
现在我们来看2.0之后的参数传递和状态处理方式:
1.参数传递。使用job.getJobDataMap().put()方式向Job当中传递参数,简单看了一下源码,JobDataMap类实际上最终继承了实现Map接口的"DirtyFlagMap"类,而DirtyFlagMap内部又保存了一个HashMap的引用,操作都是针对这个HashMap进行的。
2.JobDataMap的持久化。即PersistJobDataAfterExecution这个注解的使用。刚开始做测试例子的时候没加这个注解,结果在Job执行过程中死活看不到jobDataMapInt这个值自加后的保存,每次都显示为初始值10,就算我直接设置也没用=。= 后来才看到这个注解。加上注解之后,每次执行完,JobDataMap都会被序列化,上次任务执行放入的值都会保存下来。
3.DisallowConcurrentExecution 注解,这个比较搞,中文的没看到太好的解释,在http://forums.terracotta.org/forums/posts/list/6777.page的问答给出了解释。基本意思就是,比如当前任务(每个JobDetail实例,同一job class、不同的jobKey也算不同的实例)每隔10秒执行一次,但是,任务的执行花去了15秒的时间,那么必然会对下一次的执行产生影响,加上这个注释之后可以防止这种事情发生。看我的MyParaJob代码里面注释的内容,如果是11的话,线程挂起11秒,下次的结果就乱掉了,所以如果有状态可能花去比较长的时间,并且是有状态的话,就加上这个注解。
本节重要的基本上就是上面提到的三个功能点。
这次讲Quartz中Job的参数传递和状态保存。
先贴代码,还是两个类:
任务定义: MyParaJob.java
- //这两行注解。。。 极度坑爹,也是和2.0之前版本所不同的地方,务必注意 @NOTICE
- @PersistJobDataAfterExecution
- @DisallowConcurrentExecution
- public class MyParaJob implements Job {
- private int myCount = 0;
- private static int myStaticCount = 0;
- public static final String JOB_DATA_MAP_KEY = "key1";
- public MyParaJob() {
- }
- @Override
- public void execute(JobExecutionContext context) throws JobExecutionException {
- String jobName = context.getJobDetail().getKey().getName();
- SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
- JobDataMap data = context.getJobDetail().getJobDataMap();
- int jobDataMapInt = data.getInt(JOB_DATA_MAP_KEY);
- // 这里注释的内容用于理解DisallowConcurrentExecution这个注解
- //if (jobDataMapInt == 11) {
- // try {
- // Thread.sleep(11000);
- // } catch (InterruptedException e) {
- // e.printStackTrace();
- // }
- //}
- System.out.println("任务Key:" + jobName + " 正在执行,执行时间: " + dateFormat.format(Calendar.getInstance().getTime()));
- System.out.println("***private成员变量为:" + myCount + ",static成员变量为:" + myStaticCount + ",JobDataMap保存的变量为:" + jobDataMapInt);
- myCount++;
- jobDataMapInt++;
- data.put(JOB_DATA_MAP_KEY, jobDataMapInt);
- myStaticCount++;
- }
- }
接下来是进度调用: QuartzParaTest.java
- public class QuartzParaTest {
- public static void main(String[] args) throws Throwable {
- SchedulerFactory factory = new StdSchedulerFactory();
- Scheduler scheduler = factory.getScheduler();
- Date runTime = DateBuilder.nextGivenSecondDate(null, 10);
- JobDetail job = JobBuilder.newJob(MyParaJob.class).withIdentity("job1", "group1").build();
- job.getJobDataMap().put(MyParaJob.JOB_DATA_MAP_KEY, 10);
- // 每隔五秒执行,重复4次
- Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1")
- .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5).withRepeatCount(4)).startAt(runTime).build();
- scheduler.scheduleJob(job, trigger);
- // 再来个有状态的Job,如果为了看单次任务,下面这几句可以先注释掉
- job = JobBuilder.newJob(MyParaJob.class).withIdentity("job2", "group1").build();
- job.getJobDataMap().put(MyParaJob.JOB_DATA_MAP_KEY, -10);
- trigger = TriggerBuilder.newTrigger().withIdentity("trigger2", "group1")
- .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5).withRepeatCount(4)).startAt(runTime).build();
- scheduler.scheduleJob(job, trigger);
- scheduler.start();
- try {
- Thread.sleep(35L * 1000L);
- } catch (Exception e) {
- }
- scheduler.shutdown(true);
- }
- }
任务目的简单讲解一下:本例子在任务开始时,从调度器通过JobDataMap向任务里面射入了一个int值,执行时发现对于单个任务来说:
- 普通私有成员变量的操作不会影响到下次执行结果,myCount每次执行都是初始值0。
- 静态变量肯定会保存,myStaticCount每次递增。
- JobDataMap容器中保存的jobDataMapInt每次也递增。
在2.0之前,Quartz对类似有状态的任务处理方式是需要实现StatefulJob这个接口的,并且
引用
对于实现StatefulJob接口的 两个或多个有状态的 JobDetail 实例不能并发执行。说的是你创建并注册了一个有状态 JobDetail 到 Scheduler 上。你还建立了两个 Trigger 来触发这个 Job:一个每五分钟触发,另一个也是每五分钏触发。假如这两个 Trigger 试图在同一时刻触发 Job,框架是不允许这种事情发生的。第二个 Trigger 一直会被阻塞直到第一个结束。
引用自:http://blog.csdn.net/ychatou1220/article/details/5807108
当然 这只是前面版本的处理,2.0之后StatefulJob接口直接被deprecated了
- /**
- * @deprecated Interface StatefulJob is deprecated
- */
- public interface StatefulJob
- extends Job
- {
- }
现在我们来看2.0之后的参数传递和状态处理方式:
1.参数传递。使用job.getJobDataMap().put()方式向Job当中传递参数,简单看了一下源码,JobDataMap类实际上最终继承了实现Map接口的"DirtyFlagMap"类,而DirtyFlagMap内部又保存了一个HashMap的引用,操作都是针对这个HashMap进行的。
2.JobDataMap的持久化。即PersistJobDataAfterExecution这个注解的使用。刚开始做测试例子的时候没加这个注解,结果在Job执行过程中死活看不到jobDataMapInt这个值自加后的保存,每次都显示为初始值10,就算我直接设置也没用=。= 后来才看到这个注解。加上注解之后,每次执行完,JobDataMap都会被序列化,上次任务执行放入的值都会保存下来。
3.DisallowConcurrentExecution 注解,这个比较搞,中文的没看到太好的解释,在http://forums.terracotta.org/forums/posts/list/6777.page的问答给出了解释。基本意思就是,比如当前任务(每个JobDetail实例,同一job class、不同的jobKey也算不同的实例)每隔10秒执行一次,但是,任务的执行花去了15秒的时间,那么必然会对下一次的执行产生影响,加上这个注释之后可以防止这种事情发生。看我的MyParaJob代码里面注释的内容,如果是11的话,线程挂起11秒,下次的结果就乱掉了,所以如果有状态可能花去比较长的时间,并且是有状态的话,就加上这个注解。
本节重要的基本上就是上面提到的三个功能点。
0 0
- Quartz入门例子简介 从入门到菜鸟(四)
- Quartz入门例子简介 从入门到菜鸟(四)
- Quartz入门例子简介 从入门到菜鸟(一)
- Quartz入门例子简介 从入门到菜鸟(一)
- Quartz入门例子简介 从入门到菜鸟(二)
- Quartz入门例子简介 从入门到菜鸟(三)
- Quartz从入门到进阶
- Quartz从入门到进阶
- Quartz从入门到进阶
- quartz 从入门到进阶
- Quartz从入门到进阶
- Java之美[从菜鸟到高手演变]之Quartz任务调度快速入门
- Git从菜鸟到入门到放弃
- Quartz从入门到进阶(转)
- Quartz定时调度从入门到进阶
- Quartz框架从入门到实战
- quartz入门例子
- Quartz 入门例子
- L3-005. 垃圾箱分布
- Linux下安装jdk(openSUSE为例)
- 5.CAS增加验证码
- hdu1010 dfs+剪枝
- window 命令行运行的java 和 javac 显示的版本不同
- Quartz入门例子简介 从入门到菜鸟(四)
- MySQL 手动设置自动递增伟某一值
- UGUI背包(二)鼠标移动会显示信息框,拖拽物品
- 细说final关键字和static关键字
- PAT(A) - 1103. Integer Factorization (30)
- 函数调用和返回过程栈帧结构变化图(C语言举例)
- ubuntu科学软件
- 训练一 深度优先搜索
- 函数返回值及错误码设计