# Quartz API、作业和触发器
# Quartz API
Quartz API的关键接口有:
调度器[Scheduler] - 与调度器交互的主要API。
作业[Job] - 由您希望由调度器执行的组件实现的接口。
作业详情[JobDetail] - 用于定义作业的实例。
触发器[Trigger] - 定义给定作业的执行时间表的组件。
作业构建器[JobBuilder] - 用于定义/构建JobDetail实例,该实例定义作业的实例。
触发器构建器[TriggerBuilder] - 用于定义/构建Trigger实例。
调度器的生命周期受其创建的限制,通过SchedulerFactory
和对其shutdown()
方法的调用。一旦创建了Scheduler
接口,就可以添加、删除和列出作业和触发器,并执行其他与调度相关的操作(例如暂停触发器)。然而,调度器在使用start()
方法启动之前,不会实际操作任何触发器(执行作业),如第1课所示。
Quartz提供了定义领域特定语言(或DSL,有时也称为“流畅接口”)的“构建器”类。在上一课中,您看到了它的一个示例,我们将再次介绍其中的一部分:
//定义作业详情对象并将其绑定到我们的HelloJob类中
JobDetail job = newJob(HelloJob.class)
.withIdentity("myJob", "group1") //名为myJob,组为group1
.build();
//触发该作业立即运行,并每40秒一次
Trigger trigger = newTrigger()
.withIdentity("myTrigger", "group1")
.startNow()
.withSchedule(simpleSchedule()
.withIntervalInSeconds(40)
.repeatForever())
.build();
//通知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
实例的各种方法(例如表示下一个偶数小时的日期 - 如果当前为9:43:27,则为10:00:00)。
# 作业和触发器
作业是一个实现Job
接口的类,它只有一个简单的方法:
Job
接口
package org.quartz;
public interface Job {
public void execute(JobExecutionContext context)
throws JobExecutionException;
}
当Job的触发器触发时(稍后将详细介绍),execute(..)方法将由调度器的一个工作线程调用。传递给此方法的JobExecutionContext
对象,为作业实例提供了有关其“运行时”环境的信息——执行它的调度器的句柄、触发执行的触发器的句柄、作业的JobDetail
对象以及一些其他东西。
在将作业添加到调度器时,JobDetail
对象由Quartz客户端(您的程序)创建。它包含作业的各种属性设置,以及JobDataMap
,可用于存储作业类的给定实例的状态信息。它本质上是作业实例的定义,将在下一课中进一步详细讨论。
触发器对象用于触发作业的执行(或“触发”)。当您希望调度作业时,可以实例化触发器并“调整”其属性,以提供您希望的调度。触发器还可能有一个与之相关联的JobDataMap
,这对于将特定于触发器触发的参数传递给作业非常有用。Quartz附带了几种不同的触发器类型,但最常用的类型是SimpleTrigger
和CronTrigger
。
如果您需要“一次性”执行(仅在给定时间点执行一个作业),或者需要在给定时间启动一个作业,并使其重复N次,执行之间的延迟为T,SimpleTrigger
非常方便。如果您希望基于类似日历的日程安排(如“每周五中午”或“每月10日10:15”)进行触发,CronTrigger
非常有用。
为什么选择作业和触发器?许多作业调度器对作业和触发器没有单独的概念。有些人将“作业”定义为简单的执行时间(或时间表)以及一些小的作业标识符。其他的很像Quartz的工作和触发对象的结合。在开发Quartz时,我们决定在计划表和计划表上要执行的工作之间创建一个分离是有意义的。(我们认为)这有很多好处。
例如,可以独立于触发器在作业调度程序中创建和存储作业,并且可以将许多触发器与同一作业关联。这种松散耦合的另一个好处是能够配置在相关触发器过期后仍保留在调度器中的作业,以便以后可以重新调度,而无需重新定义。它还允许您修改或替换触发器,而无需重新定义其关联作业。
# 特性
在Quartz调度程序中注册作业和触发器时,会为它们提供标识密钥。作业和触发器的键(JobKey和TriggerKey)允许将它们放入“组”中,这对于将作业和触发器组织为“报告作业”和“维护作业”等类别非常有用。作业或触发器的键的名称部分在组中必须是唯一的,换句话说,作业或触发器完整的键(或标识符)是名称和组的组合。
现在,您对工作和触发器有了大致的了解,您可以在《第3课:更多关于作业和作业详细信息》和《第4课:更多有关触发器》中了解更多有关它们的信息。

微信公众号

QQ交流群
如若发现错误,诚心感谢反馈。
愿你倾心相念,愿你学有所成。
愿你朝华相顾,愿你前程似锦。