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 等
时间: 2024-09-30 05:50:42

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

Quartz深入浅出(一)

什么是Quartz Quartz是一个开源的作业调度框架,由java编写,在.NET平台为Quartz.Net,通过Quart可以快速完成任务调度的工作. Quartz能干什么/应用场景 如网页游戏中挂机自动修炼如8个小时,人物相关数值进行成长,当使用某道具后,时间减少到4个小时,人物对应获得成长值.这其中就涉及到了Scheduler操作. 网页游戏中会大量涉及到Scheduler的操作,有兴趣的朋友可自行联想. 同类框架对比 TimeTask TimeTask在Quartz前还是显得过于简单.

Quartz教程二:API,Job和Trigger

原文链接 | 译文链接 | 翻译:nkcoder | 校对:方腾飞 本系列教程由quartz-2.2.x官方文档翻译.整理而来,希望给同样对quartz感兴趣的朋友一些参考和帮助,有任何不当或错误之处,欢迎指正:有兴趣研究源码的同学,可以参考我对quartz-core源码的注释(进行中). Quartz API Quartz API核心接口有: Scheduler – 与scheduler交互的主要API: Job – 你通过scheduler执行任务,你的任务类需要实现的接口: JobDeta

初识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_project.example2; import java.util.Date; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import o

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

新的应用场景:很多时候,我们常常会遇到需要动态的添加或修改任务,而spring中所提供的定时任务组件却只能够通过修改xml中trigger的配置才能控制定时任务的时间以及任务的启用或停止,这在带给我们方便的同时也失去了动态配置任务的灵活性.所有的配置都在xml中完成,包括cronExpression表达式,十分的方便.但是如果我的任务信息是保存在数据库的,想要动态的初始化,而且任务较多的时候不是得有一大堆的xml配置?或者说我要修改一下trigger的表达式,使原来5秒运行一次的任务变成10秒运

定时组件quartz系列&lt;二&gt;quartz的集群原理

1.基本信息: Quartz是一个开源的作业调度框架,它完全由java写成,并设计用于J2Se和J2EE应用中.它提供了巨大的灵活性而不牺牲简单性.你能够用它 来为执行一个作业而创建简单的或复杂的调度.它有很多特征,如:数据库支持,集群,插件,EJB作业预构建,JavaMail及其它,支持cron- like表达式等等.其中集群配置一般比较复杂,那么在Quartz中如何配置它的集群特性呢? 2 Quartz的集群配置:      2.1 实现集群的基本原理           Quartz是通过

(转)AutoLayout深入浅出二[基本使用]

原文地址:http://grayluo.github.io/WeiFocusIo/autolayout/2015/01/24/autolayout2/ 在上一篇中我们一起讨论了Autolayout出生之前的iOS布局方式,并讲了以前的布局方式的缺陷,从而引入了AutoLayout,这篇文章我们就直接上正餐了. 接到上一篇的示例,我们使用Autolayout来完成autoresizingMask无法完成的使命,我们先在File inspector中激活autolayout,我们在Size Insp

Quartz入门 (二) SimpleTrigger

Trigger 就是触发器的意思,用来指定什么时间开始触发,触发多少次,每隔多久触发一次 SimpleTrigger 可以方便的实现一系列的触发机制. 1.下一个8秒的倍数开始运行: public class SimpleTriggerDemo { public static void main(String[] args) throws Exception{ Scheduler scheduler= StdSchedulerFactory.getDefaultScheduler(); Date

Quartz 2.x与Spring 动态整合

一.Quartz简介 Quartz是一个由James House创立的开源项目,是一个功能强大的作业调度工具,可以计划的执行任务,定时.循环或在某一个时间来执行我们需要做的事,这可以给我们工作上带来很大的帮助.例如,你的程序中需要每个月的一号导出报表.定时发送邮件或程序需要每隔一段执行某一任务--等等,都可以用Quartz来解决. Quartz大致可分为三个主要的核心: 1.调度器Scheduler:是一个计划调度器容器,容器里面可以盛放众多的JobDetail和Trigger,当容器启动后,里

第一次接触web中quartz 调度

一.所需Jar包 commons-beanutils.jar commons-collections-3.2.jar commons-digester.jar commons-logging.jar jta.jar quartz.jar  二.调度的方法(实现job接口.在execute方法中写执行的任务) import org.quartz.Job;import org.quartz.JobExecutionContext;import org.quartz.JobExecutionExcep