Lesson 2: The Quartz API, Jobs And Triggers

The Quartz API

The key interfaces of the Quartz API are:   Quartz API的关键接口是:

  • Scheduler - 与调度程序交互的主要API。
  • Job - 由您希望由调度器执行的组件实现的接口
  • JobDetail -  用于定义Jobs的实例。
  • Trigger - 一个组件,它定义了给定作业执行的时间表。
  • JobBuilder - 用于定义/构建JobDetail实例,该实例定义Jobs的实例。
  • TriggerBuilder - u 用于定义/构建触发器实例。

     调度器的生命周期受其创建,通过一个调度器工厂来创建 和对其shutdown()方法的调用  的限制 。一旦创建了调度器接口,就可以使用添加、删除和列出作业和触发器,并执行其他与调度器相关的操作(例如暂停触发器)。但是,调度程序在使用start() 方法启动之前,实际上不会对任何触发器(执行作业)执行操作,如第1课所示。

Quartz提供了定义领域特定语言(或DSL,有时也被称为“连贯接口”)的“构建器”类

在之前的课程中,您看到了一个例子,我们在这里再次介绍一部分:

  // define the job and tie it to our HelloJob class
   //定义Job并将其与HelloJob类绑定
  JobDetail job = newJob(HelloJob.class)
      .withIdentity("myJob", "group1") // name "myJob", group "group1"
      .build();

  // Trigger the job to run now, and then every 40 seconds
  //触发器 此时的job,然后每隔40秒运行一次
  Trigger trigger = newTrigger()
          .withIdentity("myTrigger", "group1")
          .startNow()
          .withSchedule(simpleSchedule()
          .withIntervalInSeconds(40)
          .repeatForever())            
      .build();

  // Tell quartz to schedule the job using our trigger  告诉quartz用我们的触发器来安排任务
  sched.scheduleJob(job, trigger);

构建作业定义的代码块是使用从JobBuilder类静态导入的方法。同样,构建触发器的代码块使用从TriggerBuilder类和SimpleScheduleBulder类导入的方法。

可以通过如下的导入语句实现DSL的静态导入:
import static org.quartz.JobBuilder.*;
import static org.quartz.SimpleScheduleBuilder.*;
import static org.quartz.CronScheduleBuilder.*;
import static org.quartz.CalendarIntervalScheduleBuilder.*;
import static org.quartz.TriggerBuilder.*;
import static org.quartz.DateBuilder.*;

    各种“ScheduleBuilder”类都有与定义不同类型的调度相关的方法。

DateBuilder类包含各种方法,以便为特定的时间点轻松构建 java.util.Date  实例。(如表示下一个偶数小时的日期—或换言之为10:00:00,如果当前为9:43 3:27)。

SchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory();
Scheduler sched = schedFact.getScheduler();
sched.start();
JobDetail jobDetail = new JobDetail("myJob", null,DumbJob.class);
Trigger trigger = TriggerUtils.makeHourlyTrigger(); // fire every hour
trigger.setStartTime(TriggerUtils.getEvenHourDate(new Date())); // start on the next even hour
trigger.setName("myTrigger");
sched.scheduleJob(jobDetail, trigger);

 

Jobs and Triggers

Job是一个实现Job接口的类,它只有一个简单的方法:

The Job Interface

  package org.quartz;

  public interface Job {
    public void execute(JobExecutionContext context)
      throws JobExecutionException;
  }

    当Job的触发器触发时(稍后详细介绍),execute(.)方法由调度器的一个工作线程调用。传递给该方法的JobExecutionContext对象提供了有关其“运行时”环境的信息的作业实例——执行它的调度程序的句柄、触发执行的触发器的句柄、作业的JobDetail对象和其他一些项。

      JobDetail对象是由Quartz客户端(您的程序)在任务添加到调度器时创建的。它包含作业的各种属性设置,以及JobDataMap,后者可用于存储作业类的给定实例的状态信息。它本质上是作业实例的定义,将在下一课中详细讨论。

        触发器对象用于触发作业的执行(或“触发”)。当您希望调度一个Job时,您实例化一个触发器并“优化”它的属性,以提供您希望拥有的调度。触发器也可能有一个与之关联的JobDataMap—这对于向特定于触发器触发的作业传递参数是有用的。Quartz拥有一些不同的触发器类型,但是最常用的类型是SimpleTriggerCronTrigger

      如果您需要“一次性”执行(只是在给定的时间点执行一个作业),或者需要在给定的时间触发一个作业,并让它重复N次,每次执行间隔为T, SimpleTrigger非常方便。CronTrigger很有用,如果您希望基于日历式的日程安排(比如“每个周五,中午”或“每月10日的10:15”)启动。

      为什么是Job和触发器?许多作业调度程序对作业和触发器没有不同的概念。有些人将“Job”定义为简单的执行时间(或调度),以及一些小的作业标识符。另一些类似于Quartz任务和触发器对象的结合。在开发Quartz的同时,我们决定在时间表和在该计划上执行的Job之间创建分离是有意义的。这(在我们看来)有许多好处。

    例如,作业可以独立于触发器创建和存储在作业调度程序中,许多触发器可以与相同的Job关联。这种松耦合的另一个好处是,可以在相关联的触发器过期后配置留在调度器中的Job,以便以后可以重新调度Job,而不必重新定义它。它还允许您修改或替换触发器,而不必重新定义它的关联作业。

Identities

      Job和触发器在与Quartz调度器注册时得到标识键。作业和触发器的键(JobKey和TriggerKey)允许它们被放在“组”中,这对于组织作业是有用的,触发器可以分为“报告作业”和“维护作业”。Job或触发器的键名部分必须在组中是唯一的——换句话说,作业或触发器的完整键(或标识符)是名称和组的复合。

你现在对什么是Job和触发器有一个大致的概念,你可以在第3课:更多关于Job和JobDetails和第4课:更多关于触发器。

猜你喜欢

转载自blog.csdn.net/qq_30336433/article/details/80928348
今日推荐