这是翻译的官方教程,英语水平好的可以直接看官方原文:https://www.quartz-scheduler.net/documentation/quartz-3.x/tutorial/using-quartz.html
就像作业一样,触发器相对来说也很容易处理,但是确实包含了各种可定制的选项,在充分利用Quartz.NET之前,您需要了解并理解这些选项。此外,如前所述,有不同类型的触发器,您可以选择以满足不同的调度需求。
常见的触发属性
除了所有触发器都具有用于跟踪其身份的TriggerKey属性之外,还有其他一些属性对于所有触发器也是通用的。这些常用属性是在构建触发器定义时使用TriggerBuilder设置的(后面将举例说明)。
以下是所有触发器共有的属性列表:
- JobKey属性指示触发器触发时,执行作业的身份。
- StartTimeUtc属性指示触发器的Schedule第一次触发的时间。该值是一个DateTimeOffset对象,用于定义给定日历日期的时间。对于某些触发类型,触发器实际上会在开始时触发,对于其他触发器,它只是标记时间表应该开始被跟踪的时间。这意味着您可以在一月份存储触发器并显示一个时间表,例如“每个月的第五天”,如果StartTimeUtc属性设置为4月1日,则在第一次触发前会有几个月的时间。
- EndTimeUtc属性指示触发的时间表应该不再有效。换句话说,一个触发器的Schedule的内容是“每个月的第五天”和7月1日结束,则触发器将在6月5日最后一次触发。
其他属性,在下面的小节中讨论解释。
优先级(Priority)
有时候,当你有很多触发器(或者你的Quartz.NET线程池中有很少的工作线程)时,Quartz.NET可能没有足够的资源来立即触发所有计划同时触发的触发器。在这种情况下,您可能想要控制哪些触发器首先在可用的Quartz.NET工作线程中触发。为此,您可以在触发器上设置优先级属性。如果N个触发器同时触发,但当前只有Z个工作线程可用,则首先执行具有最高优先级的Z个触发器。如果您没有在触发器上设置优先级,那么它将使用默认优先级5。优先级的数量可以设置为任何整数值,包括正数或负数。
注意:仅当触发器具有相同的触发时间时才比较优先级。计划在10:59执行的触发器始终在11:00执行的触发器的前面触发。
注意:当检测到触发器的作业需要恢复时,其恢复计划的优先级与原始触发器相同。
Misfire Instructions
触发器的另一个重要属性是其“Misfire Instructions”。 如果由于调度程序关闭而导致持续触发器“遗漏”其触发时间,或者Quartz.NET线程池中没有可用的线程来执行作业,则会发生Misfire。不同的触发类型可以使用不同的Misfire指令。默认情况下,他们使用“智能策略”指令 - 它具有基于触发类型和配置的动态行为。当调度程序启动时,它会搜索任何发生故障的持久性触发器,然后根据各自配置的MisFire指令更新其中的每个触发器。当你在自己的项目中开始使用Quartz.NET时,你应该让自己熟悉在给定触发器类型上定义的MisFire指令,并在他们的API文档中解释。关于MisFire指令的更多具体信息将在针对每种触发类型的教程课程中给出。
日历
实现ICalendar接口的Quartz. NET Calendar 对象可以在触发器存储在调度器中时与触发器相关联。日历对于从触发器的发射时间表中排除时间块很有用。例如,您可以创建一个触发器,在每个工作日的上午9:30触发一项工作,但排除所有假期。
日历可以是任何实现ICalendar接口的可序列化对象,如下所示:
namespace Quartz
{
public interface ICalendar
{
string Description { get; set; }
ICalendar CalendarBase { set; get; }
bool IsTimeIncluded(DateTimeOffset timeUtc);
DateTime GetNextIncludedTimeUtc(DateTimeOffset timeUtc);
ICalendar Clone();
}
}
尽管日历可以将时间段缩短到毫秒级,但您很可能会对整天的“封锁”感兴趣。作为一种方便,Quartz.NET包含了HolidayCalendar类,它就是这样做的。
日历必须通过AddCalendar(…)方法实例化并注册到调度程序。如果您使用HolidayCalendar,在实例化它之后,您应该使用它的AddExcludedDate(DateTime date)方法来填充您希望排除在日程安排之外的日子。相同的日历实例可以与多个触发器一起使用,例如:
日历示例
HolidayCalendar cal = new HolidayCalendar();
cal.AddExcludedDate(someDate);
await sched.AddCalendar("myHolidays", cal, false);
ITrigger t = TriggerBuilder.Create()
.WithIdentity("myTrigger")
.ForJob("myJob")
.WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(9, 30)) // execute job daily at 9:30
.ModifiedByCalendar("myHolidays") // but not on holidays
.Build();
// .. schedule job with trigger
ITrigger t2 = TriggerBuilder.Create()
.WithIdentity("myTrigger2")
.ForJob("myJob2")
.WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(11, 30)) // execute job daily at 11:30
.ModifiedByCalendar("myHolidays") // but not on holidays
.Build();
// .. schedule job with trigger2
触发器的构建/构建细节将在接下来的几节中给出。现在,只要相信上面的代码会创建两个触发器,每个触发器都计划每天触发一次。但是,在日历排除的期间内发生的任何触发都将被跳过。
请参阅Quartz.Impl.Calendar命名空间,了解可能适合您需求的多个ICalendar实现。