博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Quartz入门例子简介 从入门到菜鸟(四)
阅读量:4970 次
发布时间:2019-06-12

本文共 3755 字,大约阅读时间需要 12 分钟。

忙了两天 补充一下姿势。 
这次讲Quartz中Job的参数传递和状态保存。 
先贴代码,还是两个类: 
任务定义: MyParaJob.java 

Java代码
  1. //这两行注解。。。 极度坑爹,也是和2.0之前版本所不同的地方,务必注意 @NOTICE  

  2. @PersistJobDataAfterExecution  

  3. @DisallowConcurrentExecution  

  4. public class MyParaJob implements Job {  

  5.    private int myCount = 0;  

  6.    private static int myStaticCount = 0;  

  7.  

  8.    public static final String JOB_DATA_MAP_KEY = "key1";  

  9.  

  10.    public MyParaJob() {  

  11.    }  

  12.  

  13.    @Override  

  14.    public void execute(JobExecutionContext context) throws JobExecutionException {  

  15.        String jobName = context.getJobDetail().getKey().getName();  

  16.        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");  

  17.  

  18.        JobDataMap data = context.getJobDetail().getJobDataMap();  

  19.        int jobDataMapInt = data.getInt(JOB_DATA_MAP_KEY);  

  20.        // 这里注释的内容用于理解DisallowConcurrentExecution这个注解  

  21.        //if (jobDataMapInt == 11) {

      

  22.        //  try {

      

  23.        //      Thread.sleep(11000);  

  24.        //  } catch (InterruptedException e) {

      

  25.        //      e.printStackTrace();  

  26.        //  }  

  27.        //}  

  28.        System.out.println("任务Key:" + jobName + " 正在执行,执行时间: " + dateFormat.format(Calendar.getInstance().getTime()));  

  29.        System.out.println("***private成员变量为:" + myCount + ",static成员变量为:" + myStaticCount + ",JobDataMap保存的变量为:" + jobDataMapInt);  

  30.        myCount++;  

  31.        jobDataMapInt++;  

  32.        data.put(JOB_DATA_MAP_KEY, jobDataMapInt);  

  33.  

  34.        myStaticCount++;  

  35.    }  

  36. }  


接下来是进度调用: QuartzParaTest.java 

Java代码
  1. public class QuartzParaTest {  

  2.    public static void main(String[] args) throws Throwable {  

  3.        SchedulerFactory factory = new StdSchedulerFactory();  

  4.        Scheduler scheduler = factory.getScheduler();  

  5.        Date runTime = DateBuilder.nextGivenSecondDate(null, 10);  

  6.        JobDetail job = JobBuilder.newJob(MyParaJob.class).withIdentity("job1", "group1").build();  

  7.        job.getJobDataMap().put(MyParaJob.JOB_DATA_MAP_KEY, 10);  

  8.        // 每隔五秒执行,重复4次  

  9.        Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1")  

  10.                .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5).withRepeatCount(4)).startAt(runTime).build();  

  11.        scheduler.scheduleJob(job, trigger);  

  12.  

  13.        // 再来个有状态的Job,如果为了看单次任务,下面这几句可以先注释掉  

  14.        job = JobBuilder.newJob(MyParaJob.class).withIdentity("job2", "group1").build();  

  15.        job.getJobDataMap().put(MyParaJob.JOB_DATA_MAP_KEY, -10);  

  16.        trigger = TriggerBuilder.newTrigger().withIdentity("trigger2", "group1")  

  17.                .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5).withRepeatCount(4)).startAt(runTime).build();  

  18.        scheduler.scheduleJob(job, trigger);  

  19.        scheduler.start();  

  20.        try {  

  21.            Thread.sleep(35L * 1000L);  

  22.        } catch (Exception e) {  

  23.        }  

  24.        scheduler.shutdown(true);  

  25.    }  

  26. }  


任务目的简单讲解一下:本例子在任务开始时,从调度器通过JobDataMap向任务里面射入了一个int值,执行时发现对于单个任务来说: 

  • 普通私有成员变量的操作不会影响到下次执行结果,myCount每次执行都是初始值0。

  • 静态变量肯定会保存,myStaticCount每次递增。

  • JobDataMap容器中保存的jobDataMapInt每次也递增。


在2.0之前,Quartz对类似有状态的任务处理方式是需要实现StatefulJob这个接口的,并且 

引用
对于实现StatefulJob接口的
 两个或多个有状态的 JobDetail 实例不能并发执行。说的是你创建并注册了一个有状态 JobDetail 到 Scheduler 上。你还建立了两个 Trigger 来触发这个 Job:一个每五分钟触发,另一个也是每五分钏触发。假如这两个 Trigger 试图在同一时刻触发 Job,框架是不允许这种事情发生的。第二个 Trigger 一直会被阻塞直到第一个结束。


引用自: 

当然 这只是前面版本的处理,2.0之后StatefulJob接口直接被deprecated了 

Java代码
  1. /**

  2. * @deprecated Interface StatefulJob is deprecated

  3. */  

  4.  

  5. public interface StatefulJob  

  6.    extends Job  

  7. {  

  8. }  



现在我们来看2.0之后的参数传递和状态处理方式: 

1.参数传递。使用job.getJobDataMap().put()方式向Job当中传递参数,简单看了一下源码,JobDataMap类实际上最终继承了实现Map接口的"DirtyFlagMap"类,而DirtyFlagMap内部又保存了一个HashMap的引用,操作都是针对这个HashMap进行的。 

2.JobDataMap的持久化。即PersistJobDataAfterExecution这个注解的使用。刚开始做测试例子的时候没加这个注解,结果在Job执行过程中死活看不到jobDataMapInt这个值自加后的保存,每次都显示为初始值10,就算我直接设置也没用=。= 后来才看到这个注解。加上注解之后,每次执行完,JobDataMap都会被序列化,上次任务执行放入的值都会保存下来。 

3.DisallowConcurrentExecution 注解,这个比较搞,中文的没看到太好的解释,在的问答给出了解释。基本意思就是,比如当前任务(每个JobDetail实例,同一job class、不同的jobKey也算不同的实例)每隔10秒执行一次,但是,任务的执行花去了15秒的时间,那么必然会对下一次的执行产生影响,加上这个注释之后可以防止这种事情发生。看我的MyParaJob代码里面注释的内容,如果是11的话,线程挂起11秒,下次的结果就乱掉了,所以如果有状态可能花去比较长的时间,并且是有状态的话,就加上这个注解。 

本节重要的基本上就是上面提到的三个功能点。

 

本文链接:,转自:http://wwwcomy.iteye.com

转载于:https://www.cnblogs.com/licomeback/articles/3057023.html

你可能感兴趣的文章
MP3的播放与停止
查看>>
牛客(59)按之字形顺序打印二叉树
查看>>
JavaScript 图表库 xCharts
查看>>
Android项目的目录结构
查看>>
C++中“引用”的底层实现
查看>>
Spring Cloud与微服务构建:微服务简介
查看>>
Babel 是干什么的
查看>>
20180418小测
查看>>
数字三角形
查看>>
前端笔记-基础笔记
查看>>
【LeetCode & 剑指offer刷题】查找与排序题6:33. Search in Rotated Sorted Array(系列)
查看>>
GNU/Linux超级本ZaReason Ultralap 440体验
查看>>
将github上托管的代码 在我的域名下运行
查看>>
【Manthan, Codefest 18 (rated, Div. 1 + Div. 2) C】Equalize
查看>>
【codeforces 767A】Snacktower
查看>>
【MemSQL Start[c]UP 3.0 - Round 1 C】 Pie Rules
查看>>
Ognl中“%”、“#”、“$”详解
查看>>
我对应用软件——美团的看法
查看>>
执行了的程序,才是你的程序.
查看>>
struts2.x + Tiles2.x读取多个xml 配置文件
查看>>