使用 Quartz API

What is Quartz?

Quartz 是一个功能丰富的开源作业调度类库,可以与各种规模的 Java 应用集成。

Instantiating the Scheduler

SchedulerFactory factory = new StdSchedulerFactory();
Scheduler scheduler = factory.getScheduler();
scheduler.start();
JobDetail printJob = JobBuilder.newJob(PrintJob.class)
  .withIdentity("print job", "default group").build();

Trigger trigger = TriggerBuilder.newTrigger().
  withIdentity("print trigger", "default group").startNow().
  withSchedule(SimpleScheduleBuilder.simpleSchedule().
      withIntervalInSeconds(2).
      repeatForever()).build();

scheduler.scheduleJob(printJob,trigger);

Key Interfaces

接口名称 说明
Scheduler 与调度器交互的主要API
Job 调度器执行的组件需要实现的接口
JobDetail 用来定义Job的实例
Trigger 定义给定Job何时执行的组件
JobBuilder 用来定义/构建JobDetail实例
TriggerBuilder 用来定义/构建触发器实例

各种 Builder:

  • org.quartz.JobBuilder
  • org.quartz.SimpleScheduleBuilder
  • org.quartz.CronScheduleBuilder
  • org.quartz.CalenderIntervalScheduleBuilder
  • org.quartz.TriggerBuilder
  • org.quartz.DateBuilder

Jobs and Triggers

一个作业是一个实现 Job 接口的类,该接口只有一个方法:

package org.quartz;
public interface Job {
  public void execute(JobExecutionContext context)
    throws JobExecutionException;
}

当作业的触发器启动,execute 方法被调度器的某个工作线程(worker thread)调用。JobExecutionContext 对象被传递给方法以提供作业实例所在运行时环境的的信息,包括调度器和触发器的句柄、作业的 JobDetail 对象以及其他一些条目。

JobDetail 对象由你的程序在将作业添加到调度器时创建。这个对象包含作业的各种属性设定信息,包括一个被用来存储给定 Job 类实例状态信息的 JobDataMap。

Trigger 对象被用来触发作业的执行。触发器也可以有一个关联到它们的 JobDataMap。JobDataMap 在把作业参数传递给触发器的执行时是很有用的。Quartz 提供一系列不同的触发器类型,最常用的是两个:

  • SimpleTrigger。如果需要你需要“一次性”调用或者在某个给定时间每隔一个时间段 T 触发 N 次,你会觉得它很顺手。
  • CronTrigger。如果你希望像基于日历一样调度作业,它很有用。

Quartz 将作业和触发器分开的设计有很多好处。例如:你可以创建作业并将它们存储在作业调度器中而不关联触发器。这使你能够将许多触发器关联到同一个作业。这种松耦合的另一个好处是能够配置关联触发器已经失效但是仍然驻留在调度器中的作业。这使你能够在随后再次调度它们而不需要重新定义它们。这种设计还允许你在不需要重新定义关联作业的前提下修改和替换触发器。

Identities

作业和触发器在 Quartz 调度器注册时被给予标识键。作业和触发器的键(JobKey 和 TriggerKey)允许它们被放置在组中,便于组织作业和触发器。作业和触发器的键的名字部分必须是组内唯一的。换句话说,作业或者触发器完整的键(或者标识符)由名字和组组成。