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. 【原】缓存之 HttpRuntime.Cache

    1.HttpRuntime.Cache HttpRuntime.Cache 相当于就是一个缓存具体实现类,这个类虽然被放在了 System.Web 命名空间下了.但是非 Web 应用也是可以拿来用的. ...

  2. SG博弈函数模板

    下面这两个模版应该就比较严密了,这个里边的f[]是从零开始的. 转载出处:转自:http://blog.csdn.net/primoblog/article/details/13376057 1.sg ...

  3. 封装自己DB

    DB.class.php <?php /** * Created by PhpStorm. * User: brady.wang * Date: 2017/11/10 * Time: 18:00 ...

  4. mysql的row_number()实现

    在mysql中没有row_number()方法,这里模拟row_number()实现: 如有表 studentid   name age   class1 张1 15     12 张2 15     ...

  5. 【Luogu】P2016战略游戏(树形DP)

    题目链接 设f[i][j]表示以节点i为根的子树在状态j的情况下的最优解. j有两种情况. j=1:i这个根节点有士兵在站岗. j=0:i这个根节点没有士兵在站岗. 转移方程很好想. f[x][]+= ...

  6. [BZOJ1590] [Usaco2008 Dec]Secret Message 秘密信息(字典树)

    传送门 看到前缀就要想到字典树! 看到前缀就要想到字典树! 看到前缀就要想到字典树! #include <cstdio> #include <iostream> #define ...

  7. 【2018.10.1】【JSOI2016】最佳团体(bzoj4753)

    一看到“比值”最大(性价比最高)就知道跟分数规划有关系了.(这里讲过分数规划) 然后看到 要选一个候选人 必须选他的前置,画画图就知道是一棵树. 所以这道题是二分比值,每个点的权值就是战斗力-费用*比 ...

  8. sublime text3安装angularjs插件

    sublime能够支持AngularJS开发那绝对是一件很爽的事情.下面我一步步讲解如何为sublime安装AngularJS插件. 首先提供一个破解版的sublime text 3的下载地址:htt ...

  9. Oracle命令行创建数据库

    创建数据库文件 CREATE TABLESPACE MyDataBase LOGGING DATAFILE 'D:\Oracle\database\MyDataBase.dbf' SIZE 100M ...

  10. Java 并发编程中的 Executor 框架与线程池

    Java 5 开始引入 Conccurent 软件包,提供完备的并发能力,对线程池有了更好的支持.其中,Executor 框架是最值得称道的. Executor框架是指java 5中引入的一系列并发库 ...