quarzt(官方)---给自己看的文档(触发器)
像工作一样,触发器非常容易使用,但是包含可以充分利用Quartz之前需要了解和理解的各种可自定义选项。 另外,如前所述,您可以选择不同类型的触发器来满足不同的调度需求。
您将在第5课:简单触发器和第6课:Cron触发器中了解两种最常见的触发器类型。
常用触发属性
除了所有触发器类型都具有用于跟踪其身份的TriggerKey属性的事实外,还有许多其他属性对所有触发类型都是通用的。 当您构建触发器定义时,这些常用属性将使用TriggerBuilder进行设置(其中的示例将遵循)。
以下是所有触发器类型共有的属性列表:
- “jobKey”属性指示触发器触发时应执行的作业的身份。
- “startTime”属性指示触发器的计划何时首次生效。 该值是一个java.util.Date对象,它定义了给定日历日期的时间。 对于某些触发类型,触发器实际上将在开始时触发,对于其他触发类型,触发器只是标记计划开始遵循的时间。 这意味着您可以在1月份期间存储具有“每月第5天”的时间表的触发器,如果startTime属性设置为4月1日,则将在第一次触发前几个月。
- “endTime”属性指示何时触发器的计划不再有效。 换句话说,具有“每月第五天”和7月1日结束时间的触发器将于6月5日上线。
以下小节将讨论其他属性,其中有更多的解释。
优先
有时,当您有许多Triggers(或Quartz线程池中的几个工作线程)时,Quartz可能没有足够的资源来立即触发所有计时在同一时刻触发的触发器。 在这种情况下,您可能希望控制哪些触发器在可用的Quartz工作线程中首先破解。 为此,您可以在触发器上设置优先级属性。 如果N触发器同时触发,但目前只有Z工作线程可用,则首先执行具有最高优先级的第一个Z触发器。 如果您没有在触发器上设置优先级,那么它将使用默认优先级5.任何整数值都允许优先级为正或负。
注意:仅当触发器具有相同的消防时间时,才会比较优先级。 预计在10:59起火的触发器将在11:00之前总是开火。
注意:当检测到触发器的作业需要恢复时,其恢复与原始触发器的优先级相同。
失火说明
触发器的另一个重要属性是它的“失火指令”。 如果由于调度程序关闭而导致持续触发器“启动”其启动时间,或者由于Quartz的线程池中没有用于执行该作业的线程,则会发生失火。 不同的触发类型有不同的失火指示可供他们使用。 默认情况下,它们使用“智能策略”指令 - 其具有基于触发器类型和配置的动态行为。 当调度程序启动时,它会搜索任何持续的触发器,这些触发器已经失效,然后根据其单独配置的失火指令更新它们。 当您在自己的项目中开始使用Quartz时,您应该熟悉在给定的触发器类型上定义的失火指令,并在JavaDoc中进行了说明。 有关失火指示的更多具体信息将在每个触发类型特定的教程课程中给出。
日历
Quartz Calendar对象(而不是java.util.Calendar对象)可以在触发器定义并存储在调度程序中时与触发器相关联。 日历可用于从触发器的触发时间表中排除一段时间。 例如,您可以创建一个触发器,每个工作日在上午9:30触发一个工作,然后添加一个排除所有业务假期的日历。
日历可以是实现日历界面的任何可序列化对象,如下所示:
日历界面
package org.quartz;
public interface Calendar {
public boolean isTimeIncluded(long timeStamp);
public long getNextIncludedTime(long timeStamp);
}
请注意,这些方法的参数是长类型。 您可能会猜到,它们是毫秒格式的时间戳。 这意味着日历可以“阻止”一段时间窄,为一毫秒。 最有可能的是,您将对整个日子的“封锁”感兴趣。 为方便起见,Quartz包括类org.quartz.impl.HolidayCalendar,它只是这样做。
日历必须通过addCalendar(..)方法实例化并注册到调度程序。 如果您使用HolidayCalendar,在实例化之后,您应该使用其addExcludedDate(Date date)方法来填充您希望排除在调度中的日期。 相同的日历实例可以与多个触发器一起使用,如:
日历示例
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包,了解适合您需要的多个Calendar实现。

浙公网安备 33010602011771号