Quartz深入浅出入门教程二



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,进行简单的输出
      1. package org.quartz.examples.examples01;
      2. import java.util.Date;
      3. import org.slf4j.Logger;
      4. import org.slf4j.LoggerFactory;
      5. import org.quartz.Job;
      6. import org.quartz.JobExecutionContext;
      7. import org.quartz.JobExecutionException;
      8. /**
      9.  * hello world Quartz
      10.  * @author weeks
      11.  *
      12.  */
      13. public class HelloJob implements Job {
      14.     private static Logger _log = LoggerFactory.getLogger(HelloJob .class );
      15.     /**
      16.      * Job,Job需要一个公有的构造函数,否则Factory无法构建
      17.      */
      18.     public HelloJob() {
      19.     }
      20.     /**
      21.      * 实现execute方法
      22.      */
      23.     public void execute(JobExecutionContext context)
      24.         throws JobExecutionException {
      25.         _log.info( ”Hello World! - ” + new Date());
      26.     }
      27. }
    2. 创建我们的Job运行例子,在下一分钟执行我们自己Job
      1. package org.quartz.examples.examples01;
      2. import static org.quartz.DateBuilder.evenMinuteDate ;
      3. import static org.quartz.JobBuilder.newJob ;
      4. import static org.quartz.TriggerBuilder.newTrigger ;
      5. import org.quartz.JobDetail;
      6. import org.quartz.Scheduler;
      7. import org.quartz.SchedulerFactory;
      8. import org.quartz.Trigger;
      9. import org.quartz.impl.StdSchedulerFactory;
      10. import org.slf4j.Logger;
      11. import org.slf4j.LoggerFactory;
      12. import java.util.Date;
      13. /**
      14.  * 此Demo将演示如何启动和关闭Quartz调度器,以及如何运作
      15.  * @author weeks
      16.  *
      17.  */
      18. public class SimpleExample {
      19.   public void run() throws Exception {
      20.     Logger log = LoggerFactory.getLogger(SimpleExample.class);
      21.     log.info(“——- Initializing ———————-”);
      22.     // 1、工厂模式 构建Scheduler的Factory,其中STD为Quartz默认的Factory,开发者亦可自行实现自己的Factory;Job、Trigger等组件
      23.     SchedulerFactory sf = new StdSchedulerFactory();
      24.     // 2、通过SchedulerFactory获得Scheduler对象
      25.     Scheduler sched = sf.getScheduler();
      26.     log.info(“——- Initialization Complete ———–”);
      27.     // 3、org.quartz.DateBuilder.evenMinuteDate <下一分钟>  – 通过DateBuilder构建Date
      28.     Date runTime = evenMinuteDate(new Date());
      29.     log.info(“——- Scheduling Job  ——————-”);
      30.     // 4、org.quartz.JobBuilder.newJob –通过JobBuilder构建Job
      31.     JobDetail job = newJob(HelloJob.class).withIdentity(“job1″, ”group1″).build();
      32.     // 5、通过TriggerBuilder进行构建
      33.     Trigger trigger = newTrigger().withIdentity(“trigger1″ , ”group1″).startAt(runTime ).build();
      34.     // 6、工厂模式,组装各个组件<JOB,Trigger>
      35.     sched.scheduleJob(job, trigger);
      36.     // [group1.job1] will run at:
      37.     log.info(job.getKey() + ” will run at: ” + runTime);
      38.     // 7、start
      39.     sched.start();
      40.     log.info(“——- Started Scheduler —————–”);
      41.     log.info(“——- Waiting 65 seconds… ————-”);
      42.     try {
      43.       // wait 65 seconds to show job
      44.       Thread.sleep(65L * 1000L);
      45.       // executing…
      46.     } catch (Exception e) {
      47.       //
      48.     }
      49.     // shut down the scheduler
      50.     log.info(“——- Shutting Down ———————”);
      51.     // 8、通过Scheduler销毁内置的Trigger和Job
      52.     sched.shutdown(true);
      53.     log.info(“——- Shutdown Complete —————–”);
      54.   }
      55.   public static void main(String[] args) throws Exception {
      56.     SimpleExample example = new SimpleExample();
      57.     example.run();
      58.   }
      59. }
  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的源代码,它保存着所有上下文信息
          1. private transient Scheduler scheduler ;
          2. private Trigger trigger;
          3. private JobDetail jobDetail;
          4. private JobDataMap jobDataMap;
          5. private transient Job job;
          6. private Calendar calendar;
          7. private boolean recovering = false;
          8. private int numRefires = 0;
          9. private Date fireTime;
          10. private Date scheduledFireTime;
          11. private Date prevFireTime;
          12. private Date nextFireTime;
          13. private long jobRunTime = -1;
          14. private Object result;
          15. private HashMap<Object, Object> data=new HashMap<Object, Object>();
        3. 关于JobDetail
          1. JobDetail不存储具体的实例,但它允许你定义一个实例,JobDetail 又指向JobDataMap
          2. JobDetail持有Job的详细信息,如它所属的组,名称等信息
        4. 关于JobDataMap
          1. JobDataMap保存着任务实例的对象,并保持着他们状态信息,它是Map接口的实现,即你可以往里面put和get一些你想存储和获取的信息.
      3. 关于Trigger
        1. 即根据具体约定的触发器,具体的如:SimpleTrigger、CronTrigger 等