Quartz第四课 More About Triggers(官方文档翻译)

对于Job、Trigger我们很容易去使用它。但是要更好地使用Quartz.NET,需要对它们有充分的掌握。正如前面所说,有很多类型的触发器,你需要根据实际情况选择合适自己的。

Common Trigger Attributes

Trigger除了有个TriggerKey 属性来追踪其信息,还有其它常见的属性,这些属性在TriggerBuild的时候进行设置。

 

下面是常见Trigger属性列表:

 

l  JobKey属性在Trigger启动的时候,对其进行身份验证;

l  StartTimeUtc属性表示第一次触发的时间。该值是一个的DateTimeOffset对象,在一个给定的日历日期定义某个时刻。对于一些Trigger类型,触发实际是开始执行时间,对于其它而言它只是标志着时间表应该开始被跟踪的时间。这意味着你可以与调度触发存储诸如一月份“每月的第5天”,如果StartTimeUtc属性设置为4月1日这将是第一次触发前几个月。

l  EndTimeUtc属性表示触发的Trigger不再执行的时间。换句话说,以“每月的5日”的时间表,在7月1日的结束。6月5日最后一次触发它

对于其它的属性,在下面的小节将会进一步解释

Priority

正常来说,当你有许多Trigger(或者有一些工作线程在你的Quartz线程池)时,Quartz并没有足够的资源去同时启动Trigger。因此,你想控制你的哪一个Trigger首先执行在你的Quartz线程中。为此,你可以设置Trigger的优先级。如果在同一时间有N个Trigger要启动,但是仅有一个线程能有效的工作。那么第一执行的Trigger有最高的优先级。如果你没有设置优先级,Quartz会使用默认的优先级5.任何整数能被使用在优先级设置中,包括正负数。

 

注意:优先级仅对相同时间的Trigger有效。对应10:59的Trigger总是咸鱼11:00的Trigger触发

 

注意:当一个触发任务被回收,它的回收者具有其一样的优先级并带有原始的Trigger。

Misfire Instructions

另外一个重要的属性是不启动指令。如果Trigger错过启动时间由于scheduler被关闭或者Quartz线程池中没有现成来执行Job,那么会启动关闭指令。对于不同的Trigger类型有不同有效关闭它们的指令。默认使用一个‘smart policy指令—它可以动态判断依据trigger类型和配置信息。当调度者(scheduler )启动的时候,它会自动搜索那些没有被启动的Trigger。然后更新这些Trigger依据有效的配置信息。当你使用Quartz在你的项目中的时候,你应该定制自己的不启动机制指令依据你使用的Trigger类型。并且写好说明Api文档。关于MisFire 指令更多的说明将会在本教程中系列课程中继续说明。

 

Calendars

Quartz中的Calendar 对象实现ICalendar 接口,它与Triggers 触发时间相关联。Calendars 是非常有用的在Trigger正在启动日程时间里,您可以创建一个上午9:30触发一个任务每个工作日一个触发器,但随后补充说,排除所有业务的假期Calendar 。

 

Calendar能被转换为任意一个实现了ICalendar 接口的对象。其如下:

 1 namespace Quartz
 2 {
 3     public interface ICalendar
 4     {
 5         string Description { get; set; }
 6 
 7         ICalendar CalendarBase { set; get; }
 8 
 9         bool IsTimeIncluded(DateTimeOffset timeUtc);
10 
11         DateTime GetNextIncludedTimeUtc(DateTimeOffset timeUtc);
12     }
13 }

虽然calendars 能够起作用的时间在几毫秒内,但是你可能更关注对于一整天阻止,为了方便,Quartz中的HolidayCalendar做到了这一点。

 

Calendars 必须被实例化然后调用scheduler 的AddCalendar方法注册。如果你使用的是HolidayCalendar,在你实例化之后,你必须调用它的AddExcludedDate(DateTime date) 方法,让它能在你希望的时间里工作。同一个calendar 实例可以被多个triggers 如下使用:

 1 HolidayCalendar cal = new HolidayCalendar();
 2     cal.AddExcludedDate(someDate);
 3     
 4     sched.AddCalendar("myHolidays", cal, false);
 5     
 6     ITrigger t = TriggerBuilder.Create()
 7         .WithIdentity("myTrigger")
 8         .ForJob("myJob")
 9         .WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(9, 30)) // execute job daily at 9:30
10         .ModifiedByCalendar("myHolidays") // but not on holidays
11         .Build();
12 
13     // .. schedule job with trigger
14 
15     ITrigger t2 = TriggerBuilder.Create()
16         .WithIdentity("myTrigger2")
17         .ForJob("myJob2")
18         .WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(11, 30)) // execute job daily at 11:30
19         .ModifiedByCalendar("myHolidays") // but not on holidays
20         .Build();
21     
22 // .. schedule job with trigger2

触发器的 construction/building的细节将在接下来的课程中给出。现在,只学会上面的代码创建了两个触发器,每个计划每天启动。然而,任何将在由日历排除的期间发生了启动的将被跳过。

见Quartz.Impl.Calendar命名为一些的iCalendar实现,可能会满足您的需求。

posted @ 2016-09-20 20:02  通信的搞程序  阅读(398)  评论(0)    收藏  举报