Hello Quartz / 本文通过一个简单的样例让大家高速了解Quartz,上手。并了解Quartz内的一些关键对象 如 Scheduler、Job、Trigger、JobExecutionContext等对象

  1. 导入Quartz所需的两个jar包 <quartz-2.2.1.jarr、quartz-jobs-2.2.1.jar>

    1. 创建我们自己的Job类 HelloJob,进行简单的输出
    2. package org.quartz.examples.examples01;
      
      import java.util.Date;
      import org.slf4j.Logger;
      import org.slf4j.LoggerFactory;
      import org.quartz.Job;
      import org.quartz.JobExecutionContext;
      import org.quartz.JobExecutionException; /**
      * hello world Quartz
      * @author weeks
      *
      */
      public class HelloJob implements Job { private static Logger _log = LoggerFactory.getLogger(HelloJob .class ); /**
      * Job,Job须要一个公有的构造函数。否则Factory无法构建
      */
      public HelloJob() {
      } /**
      * 实现execute方法
      */
      public void execute(JobExecutionContext context)
      throws JobExecutionException {
      _log.info( "Hello World! - " + new Date());
      } }
    3. 创建我们的Job执行样例,在下一分钟执行我们自己Job
    4. package org.quartz.examples.examples01;
      
      import static org.quartz.DateBuilder.evenMinuteDate ;
      import static org.quartz.JobBuilder.newJob ;
      import static org.quartz.TriggerBuilder.newTrigger ;
      import org.quartz.JobDetail;
      import org.quartz.Scheduler;
      import org.quartz.SchedulerFactory;
      import org.quartz.Trigger;
      import org.quartz.impl.StdSchedulerFactory;
      import org.slf4j.Logger;
      import org.slf4j.LoggerFactory;
      import java.util.Date; /**
      * 此Demo将演示怎样启动和关闭Quartz调度器。以及怎样运作
      * @author weeks
      *
      */
      public class SimpleExample { public void run() throws Exception {
      Logger log = LoggerFactory.getLogger(SimpleExample.class); log.info("------- Initializing ----------------------"); // 1、工厂模式 构建Scheduler的Factory。当中STD为Quartz默认的Factory,开发人员亦可自行实现自己的Factory;Job、Trigger等组件
      SchedulerFactory sf = new StdSchedulerFactory();
      // 2、通过SchedulerFactory获得Scheduler对象
      Scheduler sched = sf.getScheduler(); log.info("------- Initialization Complete -----------"); // 3、org.quartz.DateBuilder.evenMinuteDate <下一分钟> -- 通过DateBuilder构建Date
      Date runTime = evenMinuteDate(new Date()); log.info("------- Scheduling Job -------------------"); // 4、org.quartz.JobBuilder.newJob --通过JobBuilder构建Job
      JobDetail job = newJob(HelloJob.class).withIdentity("job1", "group1").build(); // 5、通过TriggerBuilder进行构建
      Trigger trigger = newTrigger().withIdentity("trigger1" , "group1").startAt(runTime ).build(); // 6、工厂模式。组装各个组件<JOB,Trigger>
      sched.scheduleJob(job, trigger); // [group1.job1] will run at:
      log.info(job.getKey() + " will run at: " + runTime); // 7、start
      sched.start(); log.info("------- Started Scheduler -----------------"); log.info("------- Waiting 65 seconds... -------------");
      try {
      // wait 65 seconds to show job
      Thread.sleep(65L * 1000L);
      // executing...
      } catch (Exception e) {
      //
      } // shut down the scheduler
      log.info("------- Shutting Down ---------------------");
      // 8、通过Scheduler销毁内置的Trigger和Job
      sched.shutdown(true);
      log.info("------- Shutdown Complete -----------------");
      } public static void main(String[] args) throws Exception { SimpleExample example = new SimpleExample();
      example.run(); } }
  2. 让我们来看看上面的代码到底做了些什么:
    1. 创建一个Quartz Job类,必须实现 org.quartz.Job 。这个接口仅仅有一个你要实现的方法,execute方法。当中execute的接口定义例如以下

      1. void execute(JobExecutionContext  context)  throws JobExecutionException;
      2. 当Quartz调度器到约定的时间,它就会生成一个Job的实例,所以你实现Job接口 必须提供一个公有函数,否则会抛出异常。并调用execute方法.当中调度器仅仅管执行,而不关心结果。除非抛出JobExecutionException异常.
      3.  JobExecutionContext 中封装有Quartz执行所须要的全部信息。能够參见以下详细的代码片段.
    2. 当中涉及到的Scheduler、Job、Trigger 3个关键对象  (兴许会专门介绍这3个对象)
      1. 当中Scheduler调度器对象,它的方法有start()、shutdown()等方法。负责管理整个调度作业.
      2. Job 又与几个对象有关 Job、JobDetail、JobDataMap
        1. 通过类图来看他们之间的关系
        2. 通过类图能够非常明显的看出由JobExecutionContext来组装各个子组件,我们看看JobExecutionContextImpl的源码,它保存着全部上下文信息
        3.     private transient Scheduler scheduler ;
          
              private Trigger trigger;
          
              private JobDetail jobDetail;
          
              private JobDataMap jobDataMap;
          
              private transient Job job;
          
              private Calendar calendar;
          
              private boolean recovering = false;
          
              private int numRefires = 0;
          
              private Date fireTime;
          
              private Date scheduledFireTime;
          
              private Date prevFireTime;
          
              private Date nextFireTime;
          
              private long jobRunTime = -1;
          
              private Object result;
          
              private HashMap<Object, Object> data=new HashMap<Object, Object>();
        4. 关于JobDetail
          1. JobDetail不存储具体的实例,但它同意你定义一个实例。JobDetail 又指向JobDataMap
          2. JobDetail持有Job的具体信息,如它所属的组,名称等信息
        5. 关于JobDataMap
          1. JobDataMap保存着任务实例的对象,并保持着他们状态信息。它是Map接口的实现,即你能够往里面put和get一些你想存储和获取的信息.
      3. 关于Trigger
        1. 即依据详细约定的触发器,详细的如:SimpleTrigger、CronTrigger 等

Quartz深入浅出(二)的更多相关文章

  1. java代理的深入浅出(二)-CGLIB

    java代理的深入浅出(二)-CGLIB 1.基本原理 CGLIB的原理就是生成一个要代理类的子类,子类重写要代理的类的所有不是final的方法.在子类中拦截所有父类方法的调用,拦截下来交给设置的Me ...

  2. Quartz学习--二 Hello Quartz! 和源码分析

    Quartz学习--二  Hello Quartz! 和源码分析 三.  Hello Quartz! 我会跟着 第一章 6.2 的图来 进行同步代码编写 简单入门示例: 创建一个新的java普通工程 ...

  3. Quartz教程二:API,Job和Trigger

    原文链接 | 译文链接 | 翻译:nkcoder | 校对:方腾飞 本系列教程由quartz-2.2.x官方文档翻译.整理而来,希望给同样对quartz感兴趣的朋友一些参考和帮助,有任何不当或错误之处 ...

  4. Quartz实用二三事

    注意:本文项目使用的Quartz版本为2.2.1 一.关于Trigger Trigger tg = newTrigger().withIdentity("tg3", "g ...

  5. 定时组件quartz系列<二>quartz的原理

    Quartz是一个大名鼎鼎的Java版开源定时调度器,功能强悍,使用方便.   一.核心概念   Quartz的原理不是很复杂,只要搞明白几个概念,然后知道如何去启动和关闭一个调度程序即可.   1. ...

  6. Spring+Quartz 整合二:调度管理与定时任务分离

    新的应用场景:很多时候,我们常常会遇到需要动态的添加或修改任务,而spring中所提供的定时任务组件却只能够通过修改xml中trigger的配置才能控制定时任务的时间以及任务的启用或停止,这在带给我们 ...

  7. iOS - Quartz 2D 二维绘图

    1.Quartz 2D 简介 Quartz 2D 属于 Core Graphics(所以大多数相关方法的都是以 CG 开头),是 iOS/Mac OSX 提供的在内核之上的强大的 2D 绘图引擎,并且 ...

  8. 初识Quartz(二)

    简单作业: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 package quartz_pr ...

  9. 定时组件quartz系列<二>quartz的集群原理

    1.基本信息:      Quartz是一个开源的作业调度框架,它完全由java写成,并设计用于J2Se和J2EE应用中.它提供了巨大的灵活性而不牺牲简单性.你能够用它 来为执行一个作业而创建简单的或 ...

随机推荐

  1. UVA - 10591 Happy Number

    Happy Number UVA - 10591 Let the sum of the square of the digits of a positive integer S0 be represe ...

  2. Playrix Codescapes Cup (Codeforces Round #413, rated, Div. 1 + Div. 2) 一夜回到小学生

    我从来没想过自己可以被支配的这么惨,大神讲这个场不容易掉分的啊 A. Carrot Cakes time limit per test 1 second memory limit per test 2 ...

  3. linux的自启动服务脚本的(/etc/rc.d/init.d或者其链接/etc/init.d)

    转载地址:http://www.cnblogs.com/diyunpeng/archive/2009/11/11/1600886.html Linux有自己一套完整的启动体系,抓住了linux启动的脉 ...

  4. 【Luogu】P3195玩具装箱(斜率优化DP)

    这题还是比较炫的 题目链接 我们设f[i]是已经装了前i个玩具,且第i个玩具是某箱子里装的最后一个东西(废话) 那我们很轻松可以想到一个转移方程 ;i<=n;++i) ;j<i;++j) ...

  5. 【Luogu】P3052摩天大楼里的奶牛(遗传算法乱搞)

    一道状压题,但今天闲来无事又用遗传乱搞了一下. 设了一个DNA数组,DNA[i]记录第i个物品放在哪个组里.适应度是n-这个生物的组数+1. 交配选用的是轮盘赌和单亲繁殖——0.3的几率单点变异.(事 ...

  6. [luoguP1131] [ZJOI2007]时态同步(贪心)

    传送门 显然是一棵树. 又显然一段一段地增加比较优. 我们可以dfs,并且尽量把每一个节点所有子树中所有节点的时间增加到一样. #include <vector> #include < ...

  7. hdu 1390

    #include<stdio.h> int main() { int t,n,a[1001]; scanf("%d",&t); while(t--) { sca ...

  8. 【BZOJ2049】洞穴勘测(LCT)

    题意:一张图,要求支持以下操作: 1.加边 2.删边 3.询问两点之间是否联通 100%的数据满足n≤10000, m≤200000 思路:LCT裸题,不需要维护任何信息 ..,..]of longi ...

  9. 【shell】shell编程(四)-循环语句

    上篇我们学习了shell中条件选择语句的用法.接下来本篇就来学习循环语句.在shell中,循环是通过for, while, until命令来实现的.下面就分别来看看吧. for for循环有两种形式: ...

  10. HDU 4803 Poor Warehouse Keeper (贪心+避开精度)

    555555,能避开精度还是避开精度吧,,,,我们是弱菜.. Poor Warehouse Keeper Time Limit: 2000/1000 MS (Java/Others)    Memor ...