一. Quartz 的核心要素
一个job可以被多个trigger关联,但是一个trigger只能关联一个job。
1. 任务调度器 Scheduler
1.1 作用
Scheduler可以进行增加、删除及显示任务(Job)与触发器(Trigger),并且可以进行如开始、暂停一个触发器等一系列与调度相关的工作。
1.2 创建
创建Scheduler需要通过StdSchedulerFactory或DirectSchedulerFactory工厂来创建。由于
DirectSchedulerFactory需要详细的手工编码来进行设置,使用起来不太方便,所以一般情况下会通过StdSchedulerFactory来创建任务调度器。
1.3. 生命周期
一个调度器的生命周期为:SchedulerFactory创建成后,直到执行其shutdown()方法。
1.4 工厂配置
StdSchedulerFactory用于创建Scheduler,其依赖于一系列的属性来决定如何产生Scheduler,一般使用quartz.properties配置文件的方式进行配置。
2. 触发器 Trigger
2.1 作用
Trigger是用于定义调度时间的元素,即按照什么时间规则去执行任务。
2.2 分类
Quartz中主要提供了4种类型的Trigger:SimpleTrigger,CronTirgger,DateIntervalTrigger,和NthIncludedDayTrigger。项目中使用较多的是SimpleTrigger和CronTirgger。
-
SimpleTrigger: SimpleTrigger用于规定时间执行一次或在规定的时间段以一定的时间间隔重复触发执行任务,主要属性有:开始时间、结束时间(优先于重复次数)、重复次数、重复时间间隔。
-
CronTirgger:基于cron表达式,支持类似日历的重复间隔,而非单一的时间间隔。既可以指定简单的时间间隔,也可以指定精确日期,基本上满足一般的业务需求。
2.3 属性
Trigger中有一些共同属性,这些属性可以通过TriggerBuilder来进行设置。主要有以下共同属性:
- triggerKey:触发器的唯一标识,由名称和组名联合组成,便于调度器查找、调用。
- jobKey:任务的唯一标识,当触发器被触发时,确定应该执行哪个任务
- startTime:触发器第一次触发的开始时间
- endTime:触发器结束时间
2.4 Calendars
Quartz提供了与Trigger关联的Calendars对象,当你希望在某一时间不想去触发触发器时,可以使用Calendars对象。Calendars需要在Scheduler定义过程中,通过scheduler.addCalendar()进行初始化和注册。
2.5 未启动命令
未启动指令用于当Trigger未正常触发时,是否恢复执行的场景,默认会使用smart policy指令。当Scheduler开启时,它将搜索所有未启动的持久化的触发器,然后基于触发器各自配置的“未启动指令”来更新触发器。
2.6 优先级
当在同一时间存在多个触发器时,Quartz可能没有足够的资源立即触发所有的触发器,我们可以通过设置每个Trigger的优先级来指定优先触发哪个触发器,默认的优先级为5,可取任意的整型值,包括正数或负数。
2.7 代码示例
public class MyTriggers {
/**
* 示例
* 设置公共属性
*/
Trigger trigger = newTrigger()
//设置触发器标识
.withIdentity("myTrigger")
//设置触发器优先级
.withPriority(1)
//设置触发时间,dailyAtHourAndMinute为cronTriggerBuilder的方法,每天09:30
.withSchedule(dailyAtHourAndMinute(9,30)
//设置未启动指令
.withMisfireHandlingInstructionFireAndProceed())
//设置执行的任务