项目地址:
https://github.com/yuleiqq/quartz_example/tree/master/quartz_study
目录
与作业一样,触发器也很容易使用,但是在充分利用Quartz之前,您需要了解和理解触发器中包含的各种可定制选项。另外,如前所述,您可以选择不同类型的触发器来满足不同的调度需求。
Trigger 的共同属性
除了所有触发器类型都具有用于跟踪其身份的TriggerKey属性之外,还有许多其他属性对于所有触发器类型都是通用的。这些公共属性是在构建触发器定义时使用TriggerBuilder设置的(下面将给出相关示例)。
以下是所有触发器类型的通用属性列表:
- “jobKey” 属性表示触发器触发时应该执行的作业的标识。
- “startTime”属性指示触发器的调度何时开始生效。该值是java.util。日期对象,定义给定日历日期上的某个时间点。对于某些触发器类型,触发器实际上会在启动时触发,而对于其他触发器,它只是标记应该开始遵循计划的时间。这意味着您可以存储一个触发器,并在一月期间使用一个时间表,例如“每个月的第5天”,如果startTime属性设置为4月1日,则在第一次触发之前的几个月。
- “endTime”属性指示触发器的计划何时不再有效。换句话说,如果一个触发器的日程表是“每个月的第5天”,并在7月1日结束,那么它将在6月5日最后一次触发。
其他需要更多解释的属性将在下面的小节中讨论。
Priority(优先级)
有时候,当您有很多触发器(或者在Quartz线程池中只有很少的工作线程)时,Quartz可能没有足够的资源立即触发所有计划在同一时间触发的触发器。在这种情况下,您可能希望控制哪个触发器在可用的Quartz工作线程上第一次出现故障。为此,可以在触发器上设置优先级属性。如果N个触发器同时触发,但是当前只有Z个工作线程可用,那么优先级最高的第一个Z触发器将首先执行。如果您没有在触发器上设置优先级,那么它将使用默认的优先级5。任何整数值都允许优先级为正或负。
注意:只有当触发器具有相同的触发时间时,才会比较优先级。预定于10:59发射的触发器总是在预定于11:00发射的触发器之前发射。
注意:当一个触发器的作业被检测到需要恢复时,它的恢复计划与原始触发器具有相同的优先级。
失败的指令
触发器的另一个重要属性是“misfire instruction”。如果持久性触发器因为关闭调度程序或因为Quartz的线程池中没有可用的线程来执行作业而“错过”其触发时间,则会发生误触发。不同的触发类型有不同的失败指令。默认情况下,它们使用“智能策略”指令,该指令具有基于触发器类型和配置的动态行为。当调度器启动时,它将搜索任何已失败触发的持久触发器,然后根据它们各自配置的失败指令更新它们。当您开始在自己的项目中使用Quartz时,您应该熟悉在给定触发器类型上定义的misfire指令,并在它们的JavaDoc中进行了解释。更多关于失火指令的具体信息将在特定于每种触发类型的教程课程中给出。
Calendars(日历)
Quartz日历对象(不是java.util。在定义触发器并将其存储在调度器中时,可以将其与触发器关联。日历用于从触发器的触发计划中排除时间块。例如,您可以创建一个触发器,在每个工作日的上午9:30触发一个作业,然后添加一个排除所有业务假期的日历。
日历可以是任何实现日历接口的序列化对象,它看起来像这样:
Calendars 接口
package org.quartz;
public interface Calendar {
public boolean isTimeIncluded(long timeStamp);
public long getNextIncludedTime(long timeStamp);
}
注意,这些方法的参数都是long类型的。您可以猜到,它们是毫秒格式的时间戳。这意味着日历可以“阻挡”一毫秒的时间。最有可能的是,你会对一整天的“封锁”感兴趣。为了方便起见,Quartz包含了 org.quartz.impl.HolidayCalendar 。
Calendar Example
HolidayCalendar cal = new HolidayCalendar();
cal.addExcludedDate( someDate );
cal.addExcludedDate( someOtherDate );
sched.addCalendar("myHolidays", cal, false);
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
触发器的构造/构建的细节将在接下来的两节课中给出。现在,只需相信上面的代码创建了两个触发器,每个触发器都计划每天触发。但是,在日历排除期间发生的解雇将被跳过。
看到org.quartz.impl.calendar 包,用于许多可能适合您需要的日历实现。