第四课 更多关于Triggersui
跟做业任务相似,触发器也很是容易使用,可是在你可以充分掌握Quartz以前,你须要知道并理解许多触发器的客户化的参数。前面已经提到过,有许多不一样类型的触发器供你选择,适用不一样的调度需求。
你将会在第五课 Simple Trigger和第六课 Triggers学到这两种经常使用的触发器类型。
触发器通用属性spa
全部类型的触发器都有TriggerKey属性去跟踪触发器标识,除了这一个事实以外,还有许多其余的属性,对全部触发器类型都适用。这些通用属性在建立触发器定义时经过TriggerBuilder类来设定的。
下面的属性列表对全部类型的触发器都通用:
jobKey表示job实例的标识,触发器被触发时,该指定的job实例会执行。
StartTimeUtc 属性表示触发器的时间表首次被触发的时间。它的值是定义由指定日历时间的DateTimeOffset 对象。对于一些类型的触发器,会在启动时间触发,另外一些触发器则仅仅是标示了调度器将要被触发的时间。这意味着你能够在调度器中存储一个触发器,例如每个月的5号,若是如今是一月份,而startTime参数又设置为4月1日,那这样须要几个月后触发器才会第一次被触发。
EndTimeUtc 属性指定触发器的再也不被触发的时间,换言之,调度器中的触发器定义为“每个月的5号”,并且endTime设置为7月1日,那么6月5日将会是最后一次触发的日期。
其它的属性,更多更详细的讲解将会在接下来的子章节中进行讨论。
Priority(优先级)线程
有些时候,当你有许多触发器(或Quartz线程池中只有少数几个工做线程),Quartz可能没有足够的资源去触发全部的在同一时间段内排定好的触发器。既然这样,你可能指望控制哪一个触发器能第一个得到Quartz空闲工做线程的调用。为了达到这个目的,你能够设定触发器的Priority属性。若是N个触发器在同一时间内被触发,但只有Z工做线程当前空闲可用,那么拥有最高优先级的Z触发器将会第一个被触发。若是你没有设置触发器的优先级,它将会使用默认的优先级,优先级值为5.任何Integer类型的值均可以做为优先级,正数负数均可以。
提示:优先级只是用于在同一时间被触发的触发器进行比较。一个安排在10:59分触发的触发器永远要比安排在11:00的触发器先执行。
提示:当一个触发器的做业任务发现设置了请求恢复参数,在恢复调度执行时的优先级和原来的同样。code
触发失败指令
对象
触发器另一个重要的属性就是“misfireinstruction”。触发失败的状况是因为调度器被关闭致使存储的触发器错过了触发的时间,或是因为Quartz线程池内没有空闲的线程去执行做业任务。不一样类型的触发器有不一样的触发失败处理机制。默认状况下使用“智能策略”指令——基于触发器类型和配置的动态机制。当调度器启动时,它会查询全部存储的、触发失败的触发器,而后根据各自配置的触发失败指令更新触发器。当你开始在你的项目中使用Quartz时,你应该让本身熟悉在给定触发器类型上定义的触发失败指令和API上的文档解释。更多关于触发失败指令的详细信息将会在教程里每一个触发器类型课程中做详细介绍。blog
Calendars(日历)教程
当触发器在调度器中建立和存储时,Quartz日历对象能够与触发器相关联。日历对触发器调度定义不包含的时间段很是方便。例如,你能够建立一个触发器,定义在每一个工做日上午9:30分触发做业任务,另外添加一个日历表排除当中全部的假期。
日历对象能够是实现Calendar接口的任何可序列化的对象,以下所示:
Calendar接口
接口
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 }
日历实例化和注册到调度器中必须经过addCalendar方法。若是你使用HolidayCalendar,初始化对象完成后,应该使用addExcludedDate(Datedate)方法方便将你但愿从调度时间表中排除的日期添加到日历实例对象中。同一个日历实例对象能够应用于多个触发器,以下代码:ip
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
关于触发器结构/构建详细信息将会在后面两节课中介绍。如今,只须要相信上面的代码建立了两个触发器对象,每一个触发器天天都会被触发。然而,任何发生在日历对象中排除的日期内的触发将会跳过。
能够查阅Quartz.Impl.Calendar 包目录下的几个Calendar实现类,估计有适合你须要的类资源