Quartz2.2.x官方文档2.2.X—第三章 2.Quartz API,Jobs和Triggers

Quartz教程


内容表 | ‹ Lesson 1 | ‹ Lesson 3 |

课程 2: Quartz API, Jobs And Triggers

Quartz API

Quartz API的关键接口:

  • Scheduler - 调度操作的主API.
  • Job - 一个你实现即可执行调度任务的接口.
  • JobDetail - 使用定义的Jobs实例.
  • Trigger - 一个指定了Job执行时间的组件.
  • JobBuilder - 使用它定义/构建JobDetail和Jobs实例.
  • TriggerBuilder - 使用它定义/构建触发Trigger实例.

一个 Scheduler的生命周期受到它创建的限制,通过 SchedulerFactory 和调用shutdown()方法. 当创建调度接口,可以add、remove、list Jobs和Trigger,以及执行其他调度操作(例如暂停触发器)。实际上, 知道调用start()方法开始调度之前,调度程序不会触发任何triggers(执行jobs),如课程1所示。

Quartz提供“builder”类来作为定义特定领域的语言(或者 DSL, 有时也被成为流式接口). 在上一节课中你看到一个例子,我们继续来从这部分来讲解:


  // define the job and tie it to our HelloJob class
  JobDetail job = newJob(HelloJob.class)
      .withIdentity("myJob", "group1") // name "myJob", group "group1"
      .build();

  // Trigger the job to run now, and then every 40 seconds
  Trigger trigger = newTrigger()
      .withIdentity("myTrigger", "group1")
      .startNow()
      .withSchedule(simpleSchedule()
          .withIntervalInSeconds(40)
          .repeatForever())            
      .build();

  // Tell quartz to schedule the job using our trigger
  sched.scheduleJob(job, trigger);

构建Job定义的代码块使用的是静态类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”类有方法定义不同类型的schedules。

DateBuilder类包含不同方法来方便的构造特定时间的java.util.Date实例(例如实现获得下一个整点小时的日期 - 具体点就是,例如当前时间9:43:27 那么下个时间是10:00:00).

Jobs 和 Triggers

Job是要被实现的接口类,它仅仅包含一个简单的方法:

Job接口


  package org.quartz;

  public interface Job {

    public void execute(JobExecutionContext context)
      throws JobExecutionException;
  }

当Job的触发器被触发时,(稍后再详细介绍), execute(..)方法被调度任务之一的线程调用。传递给这个方法的JobExecutionContext对象提供了job实例关于"运行时"环境的信息-包含执行它的Scheduler句柄, 触发执行的Trigger句柄,job的JobDetail对象,一些其他信息。

在Job被添加到Scheduler时,JobDetail对象被Quartz客户端(你的程序)创建。它包含关于Job的多种设置属性,像是JobDataMap,能够使用它来记录job类实例的状态信息。本质上是定义了job实例,在下节课我们会进一步进行讨论。

Trigger对象被用来触发jobs的执行。当你希望调度一个任务,你可以实例化一个trigger,然后调整它的属性以使它在指定时间触发。Triggers也可能有与之相关联的JobDataMap-这对于参数传递给特定的触发器触发作业是有用的。Quartz ships拥有不同类型的类型, 但是大多数使用SimpleTrigger和CronTrigger类型。

如果你只需要一次使用,SimpleTrigger是十分方便的。 (在指定时间只执行一个单独的任务), 或者如果你需要在指定时间触发一个任务,让它在指定时间内触发N词,每次间隔时间T。如果你期望基于日历周期来触发,使用CronTrigger则十分方便 - 例如"每个星期五中午"或者"每个月第10天10:15。

为什么要有Jobs和触发器? 许多任务调度程序没有jobs和triggers的单独概念。有些时候会将'job'简单定义为一个执行时间(或调度)以及一些任务标识。其他则类似于Quartz job和trigger对象相结合。在开发Quartz的过程中,我们认识到在调度和时间表中所执行的任务相分离是有意义的。这有许多好处。

例如,能在作业调度中创建和存储Job,而不是依赖于trigger,大量的触发器可以关联同一个任务。另个一好吃是,这种松耦合结构能够在触发器过期后,将调度任务留在调度中,这样就可以在以后重新安排,不需要重新定义它. 它还允许你修改或替换触发器,而不需要重新定义关联的job.

特性

Jobs and Triggers在Quartz scheduler注册时会被指定标识Key。Jobs和Triggers的Key(JobKey和TriggerKey)允许它们是设置'groups',这有利于你的jobs和triggers分类,例如"reporting jobs"和"mantenance jobs"。job和trigger的键名称部分必须为组内唯一 - 换句话说,job或者trigger的完整key(或者说标识)是由分组和名称决定的。

你现在关于Jobs和Triggers有了一个一般的概念,你可以学习更多关于它们的内容 Lesson 3: More About Jobs & JobDetailsLesson 4: More About Triggers.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章