Quartz框架主要的API接口主要有下面几个:
1) scheduler- 调度器的主接口
2) Job -- 一个Java类想要成为一个Job必须实现这个类
3) JobDetail -- 用来定义Job实例
4) Trigger -- 触发器实例
5)JobBuilder -- 用来定义JobDetail实例
6)TriggerBuilder -- 用来定义触发器实例
一个scheduler的生命周期从它被schedulerFactory创u开始被shutdown结束。一旦一个scheduler被创建以后,我们就可以向这个调度器添加、删除Job和Trigger,列出这个scheduler绑定的Job和Trigger,以及其他操作(比如将某个Trigger挂起)。正如上一讲中描述的,如果scheduler的start方法不被调用,绑定到他上面的Trigger和Job都不会生效。
Quartz框架提供了一些“Builder”类,下面我们代码我们在上一节中见过,这里我们再拿出来做下示范:
// 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);
上面的代码通过从JobBuilder静态导入的方法创建一个Job,同样的,通过从TriggerBuilder导入的静态方法创建Trigger。
静态导入可以通过下面的代码实现:
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.*;
Quartz框架提供了多种scheduleBuilder类,这些类可以创建不同类型的scheduler。DateBuilder类提供了很多方法能够很方便的构建特定时间点的时间实例(比如说能够得到当前时间的下个整点时间点 )
The Job Interface
package org.quartz;
public interface Job {
public void execute(JobExecutionContext context)
throws JobExecutionException;
}
当一个Job的触发器触发的时候,上面的execute方法会被调用。JobExecutionContext包含了Job的运行时信息 。
JobDetail对象是在被添加到调度器的时候被Quartz客户端(也就是你的程序)创建的。JobDetail这个对象有很多属性可以设置,比如说JobDataMap,它可以被用来存储一个 Job的状态信息。JobDataMap是我们定义一个Job时最重要的东西,在后面的章节中我们会重点讨论。
触发器对象用来触发一个Job的执行。当你想要调度一个Job的时候,你需要实例化一个触发器并将它的触发时间调整到你希望的时间点。触发器也可以有和他们关联的JobDataMap(当多个触发器会触发同一个Job,但是需要向这个Job传递不同的data时特别有用)。Quartz框架有很多种触发器,最常用的是SimpleTrigger和CronTrigg。
为什么会将Job和触发器分开设计呢?许多任务调度框架没有将Job和Trigger的概念分开,一些框架甚至将Job简单的定义为一个在固定时间点执行 的“方法”。然而更多的是将Job和Trigger。当我们设计Quartz的时候,我们认为将调度和任务的执行是有意义的,这将有很多好处。
比如,Job可以独立于Trigger之外存储在scheduler中,多个触发器可以被绑定到一个Job。这种松耦合的另外一种好处是:当一个Trigger过期之后,可以重新复用和这个Trigger绑定的Job。