Quartz.NET-课程4:触发器

这是翻译的官方教程,英语水平好的可以直接看官方原文: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实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值