Quartz深入浅出(二)

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 等
  • 13
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
注:下文中的 *** 代表文件名中的组件名称。 # 包含: 中文-英文对照文档:【***-javadoc-API文档-中文(简体)-英语-对照版.zip】 jar下载地址:【***.jar下载地址(官方地址+国内镜像地址).txt】 Maven依赖:【***.jar Maven依赖信息(可用于项目pom.xml).txt】 Gradle依赖:【***.jar Gradle依赖信息(可用于项目build.gradle).txt】 源代码下载地址:【***-sources.jar下载地址(官方地址+国内镜像地址).txt】 # 本文件关键字: 中文-英文对照文档,中英对照文档,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 【***.jar中文文档.zip】,再解压其中的 【***-javadoc-API文档-中文(简体)版.zip】,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·本文档为双语同时展示,一行原文、一行译文,可逐行对照,避免了原文/译文来回切换的麻烦; ·有原文可参照,不再担心翻译偏差误导; ·边学技术、边学英语。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值