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. 原 jmeter中类似lr的场景设置

    有一天如果你们领导来一句给我测下这个首页到底能扛多少并发,并发量极限是多少,这时你不要慌不要忙,拿出jmeter神器,设置下场景,目标设置成1000,每10秒启动100个并发,等着看什么时候系统响应开 ...

  2. 组合数学的卡特兰数 TOJ 3551: Game of Connections

    这个就是卡特兰数的经典问题 直接用这个公式就好了,但是这个题涉及大数的处理h(n)=h(n-1)*(4*n-2)/(n+1) 其实见过好几次大数的处理了,有一次他存的恰好不多于30位,直接分成两部分l ...

  3. iRule Event Order - HTTPSv7

    v

  4. Morris Traversal 方法遍历二叉树(非递归、不用栈,O(1)空间)

    http://www.cnblogs.com/AnnieKim/archive/2013/06/15/MorrisTraversal.html

  5. Linux 下运行 C++ 程序出现 “段错误(核心已转储)”

    Linux下写C++程序出现“段错误(核心已转储)”的问题: 段错误一般就是指访问的内存超出了系统所给这个程序的内存空间,通常这个值是由gdtr来保存的,他是一个48位的寄存器,其中的32位是保存由它 ...

  6. JSON与字符串互相转换的几种方法

    1 2 3 4 5 6 7 8 字符串转对象(strJSON代表json字符串)   var obj = eval(strJSON);   var obj = strJSON.parseJSON(); ...

  7. STL学习笔记(五) 算法

    条款30:确保目标区间足够大 条款31:了解各种与排序有关的选择 //使用unaryPred划分输入序列,使得unaryPred为真的元素放在序列开头 partition(beg, end, unar ...

  8. ElasticSearch 中 REST API 详解

    本文主要内容: 1 ElasticSearch常用的操作 2 ElasticSearchbulk命令 ES REST API elasticsearch支持多种通讯,其中包括http请求响应服务,因此 ...

  9. POJ2167 Irrelevant Elements

    Time Limit: 5000MS   Memory Limit: 65536KB   64bit IO Format: %lld & %llu Description Young cryp ...

  10. Objective-C NSString的常用用法

    //1.创建常量字符串. NSString *astring = @"This is a String!";   //2.创建空字符串,给予赋值. NSString *astrin ...