Trigger最常用的有两种SimpleTrigger和CronTrigger,首先介绍Trigger的一些基础的信息,然后会详细描述这两种Trigger。
1. 通用Trigger属性
quartz中所有的触发器Trigger都有一些共有属性,如TriggerKey,startTime等,这些属性可以使用TriggerBuilder进行设置。常用的属性举例如下:
(1) triggerKey:触发器的标识,由名称与分组唯一指定,便于调度器调用与查找。
(2) jobKey: 当触发器被触发时,标识哪一个任务Job应该被执行。
(3) startTime: 表示触发器第一次开始触发的时间。
(4) endTime: 表示触发器终止触发的时间。
2. 优先级
当存在多个触发器时,quartz可能没有足够的资源立即触发所有配置为同一时间触发的triggers,因此可以设置每个Trigger的优先级。默认的优先级为5,可取任意的整型值,包括正数或负数。注意优先级仅用于所有相同时间触发的triggers。
3. 未启动指令"Misfire Instructions"
Trigger未触发一般产生于调度器被关闭,或线程池不足时。不同的Trigger类型有不同的未启动指令。默认的,他们会使用"smart policy"指定。这些指令的使用场景在于,当scheduler开启时,它将搜索所有未启动的持久化的触发器,然后基于触发器各自配置"未启动指令"来更新触发器。未启动指令用于当trigger未正常触发时,是否恢复执行的场景。
4. Calendars
与Trigger关联的Calendar对象,用于在指定的时间内不触发trigger,例如你有一个任务每天执行一次,但你不希望在节假日执行时,Calendar此时派上用场。注意此Calendar为quartz自身的定义接口,而非Java自带的Calendar。
Calendar需要在Scheduler定义过程中,通过scheduler.addCalendar()进行初始化和注册。
示例:
import static org.quartz.JobBuilder.*; import static org.quartz.TriggerBuilder.*; import static org.quartz.SimpleScheduleBuilder.*; Trigger t = newTrigger() .withIdentity("myTrigger") .forJob("myJob") .withSchedule(dailyAtHourAndMinute(9, 30)) // execute job daily at 9:30 .modifiedByCalendar("myHolidays") // but not on holidays .build(); // .. schedule job with trigger Trigger t2 = newTrigger() .withIdentity("myTrigger2") .forJob("myJob2") .withSchedule(dailyAtHourAndMinute(11, 30)) // execute job daily at 11:30 .modifiedByCalendar("myHolidays") // but not on holidays .build(); // .. schedule job with trigger2