回到顶部

Quartz.NET 2.x 文档翻译 - Lesson 4:更多Triggers触发器说明

时间:2年前   作者:请喊我大龙哥   浏览:209   [站内原创,转载请注明出处]

Quartz.NET 2.x 文档翻译 - Lesson 4:更多Triggers触发器说明 查看官网英文原文

返回目录

类似于job任务,Trigger触发器也是比较简单实现其触发工作的,但是也包含了一些我们可以自定义设置的选项,这也是我们在使用Quartz.NET前需要尽量明白和理解的点。此外,就像我们前面的章节探讨过一样,Trigger也有很多种类型的触发类型,这样就能最大限度满足我们在使用过程中的不同调度需求了。

Common Trigger Attributes

事实上,所有的Trigger类型都有各自的TriggerKey来保证获取跟踪自身,还有一些其他的公共属性。这些公共属性在我们定义Trigger触发器的时候通过TriggerBuilder创建设置。

下面简单说下这些Trigger触发器的一些公共属性:
JobKey 属性表明了在Trigger工作的时候执行对应标示的job任务
StartTimeUtc 属性标示Trigger触发器工作的时候第一个调度生效的时间,格式是DateTimeOffset对象格式。对于一些Trigger类型来说,触发动作会在调度开始的时候就启动,对于其他类型来说,仅仅是标记调度开始时间点等。这就意味着我们可以存储一个调度时间点的规则,比如每月第一天,每周第三天等。
EndTimeUtc 属性用于标记schedule调度不再执行的时间点,也就是说比如设置了每月第五天执行,并与7月1号结束,那么就会在6月5号执行最后一次调度任务。

其他相关的属性,在接下来再细聊。

Priority

有时候当我们有许多的Trigger触发器的时候(或者多个quartz.net的工作线程),quartz.net有可能没有足够的系统资源去同时执行调度任务。在这种情况下,我们就希望能控制我们的Trigger触发器获取quartz.net空闲工作线程,想要实现这一的方式,我们可以在我们的Trigger触发器设置优先级属性,如果有n多个Trigger触发器需要在同一时间点执行,但是只有z个的可用工作线程(z<n),那么具有高优先级的这些z个Trigger触发器会在这个时间点执行,如果我们不设置Trigger触发器的优先级,那么会默认优先级为5,优先级属性的数值是整数。

说明:优先级属性只有在Trigger触发器有相同的触发时间点的时候才会进行比对执行,比如10:59时间点的触发器会早于11:00的触发器。

说明:当一个Trigger触发器检测到需要被重新恢复的时候,它的优先级将恢复和原来的优先级一样。

Misfire Instructions

另一个属性就是misfire未触发属性了,这一般发生在quartz.net没有可用工作线程或者是调度被关闭,并持续的发生就会导致任务的misfire。不同的Trigger类型有不同的misfire说明。默认情况下它们使用一个基于配置和Trigger类型的动态行为类似于“智能策略”的指令。当scheduler调度启动后,会持续监测发生misfire的Trigger触发器,然后更新每个Trigger触发器的各自的misfire指令。当我们在项目中开始使用quartz.net的时候,我们需要做的就是明确了解每个Trigger类型各自的misfire属性,能清晰的了解每个的独立api等。更多关于misfire属性的说明在后面的Trigger类型章节在详细说明。

Calendars

quartz.net calendar对象实现了ICalendar接口,这样就可以scheduler调度触发Trigger的时候依照存储的时间点执行。Calendar的使用不包括时间段的方式。比如:我们可以创建一个Trigger触发器,在每个工作日的上午9:30触发job任务,然后添加一个不包括非工作日的Calendar设置。

Calendar可以是任何可序列化的对象实现iCalendar的接口,就像这样: 

namespace Quartz
{
	public interface ICalendar
	{
		string Description { get; set; }

		ICalendar CalendarBase { set; get; }

		bool IsTimeIncluded(DateTimeOffset timeUtc);

		DateTime GetNextIncludedTimeUtc(DateTimeOffset timeUtc);
	}
} 
虽然calendar可以精确到毫秒,但是我们最需要的可能是某天内,所以为了方便配置,quartz.net提供了HolidayCalendar类来处理这种情况。


Calendar必须实例化,并且通过scheduler的AddCalendar(..)注册,如果我们使用holidaycalendar,在实例化之后,我们需要使用它的AddExcludedDate(DateTime date) 方法来实现我们想要排除在外的调度时间段。同一个calendar实例可以在多个Trigger触发器使用:

Calendar Example

HolidayCalendar cal = new HolidayCalendar();
cal.AddExcludedDate(someDate);

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 

Trigger触发器的详细建立细节我们在下一个章节在讨论,上面的代码就是创建两个触发器,每一个任务每天都会被触发,但是calendar设置的跳过时间段任务将会跳过不执行。

在Quartz.Impl.Calendar命名空间下的ICalendar接口实现,可能也有你需要的。

返回目录

请喊我大龙哥最后编辑于:2年前

内容均为作者独立观点,不代表八零IT人立场,如涉及侵权,请及时告知。

评论努力加载中...
暂无评论
暂无评论

手机扫码阅读

热门相关

加载中...
关于我们   联系我们   申请友链   赞助记录   站点地图
© 2014 - 2017 www.80iter.com All Rights Reserved. 京ICP备14042174号-1
本站遵循 CC BY 4.0 协议,转载请注明出处 。