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实现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
org.quartz-scheduler:quartz:2.3.2是一个Maven坐标,用于引入Quartz任务调度框架的相关依赖。你可以在你的项目中的pom.xml文件中添加如下依赖来引入Quartz 2.3.2版本: <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.2</version> </dependency> 这个坐标代表了Quartz框架的版本号为2.3.2,可以通过Maven自动下载相关的jar包。 如果你想查看在你的项目中使用了org.quartz-scheduler:quartz:2.3.2版本后的依赖树,你可以使用命令"mvn dependency:tree"来查看。这个命令会列出项目的所有依赖关系,包括间接依赖。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [org.quartz](https://blog.csdn.net/qq_40144701/article/details/112540359)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [quartz-2.3.2-API文档-中文版.zip](https://download.csdn.net/download/qq_36462452/85549591)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [因为org.quartz-scheduler-quartz定时任务引入版本过高导致项目启动报错问题](https://blog.csdn.net/chengzhan9657/article/details/100839563)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值