和 jobs 一样, triggers 用起来也简单, 但是也有一些定制化的选项需要了解, 否则很难充分发挥 Quartz.NET 的功能. 另外, 也有很多不同类型的 trigger, 可以满足各种 scheduling 需求.
所有的trigger 类, 除了有唯一的 TriggerKey 属性外, 还有别的共同属性. 这些属性值在构造 trigger definition 的时候由 TriggerBuilder 来赋值 (底下例子里会介绍).
共有属性:
其他的属性在下面详细讨论.
如果在你的 Quartz.NET 线程池里面有好些个工作线程, Quartz.NET 可能没有足够的资源来立刻执行被设置在同一个调度时间的 trigger. 这时你需要控制下 Quartz.NET 有空闲工作线程时, 哪个 trigger 会得到执行时间. 这就需要给 trigger 设置优先级. 如果你没有设置优先级, 那么默认值为5, 优先级上可以设置任何整数值, 整数或者负数都可以.
注意: 优先级的值只对同一时间执行的 trigger 有效. 调度时间早的 trigger 不管优先级多少都会比调度时间晚的 trigger 先执行.
注意: 当一个 trigger 被检测到需要恢复, 那它的优先级会恢复到同之前的优先级一样.
misfire 的意思是一个 trigger 由于他的调度器被关掉以至于错过了它的触发时间, 或者因为在 Quartz.NET 线程池中没有可用的线程来执行 trigger 的 job. 不同的 trigger 类型都有他们各自的 misfire 指示器. 默认用 'smart policy' 指示器 - 它会根据 trigger 类型和配置来动态决定它自己的行为. 当调度器启动的时候
,它查找所有错过触发的 triggers, 然后根据他们各自配置的指示器来更新 triggers.
Quartz.NET Calendar 对象实现了 ICalendar 接口,在 trigger 被存在调度器里的时候会和 trigger 关联起来. Calendars 可以用来从 trigger 的触发时间段中移出某一段特定的时间块. 例如, 你有个 trigger 在每个工作日的上午 9:30, 然后加了一个 Calendar 来移出所有的节假日.
Calendar 可以是任何实现了 ICalendar 接口的可序列化对象, 接口如下:
namespace Quartz
{
public interface ICalendar
{
string Description { get; set; }
ICalendar CalendarBase { set; get; }
bool IsTimeIncluded(DateTimeOffset timeUtc);
DateTime GetNextIncludedTimeUtc(DateTimeOffset timeUtc);
}
}
虽然 calendarEven 可以移出小到毫秒的时间段,当时通常你可能希望移出掉整天的时间,为了方便, Quartz.NET 定义了一个HolidayCalendar类.
Calendars 必须初始化并用 AddCalendar() 注册到 scheduler. 对于 HolidayCalendar, 在初始化后, 你需要用它的AddExcludedDate(DateTime date) 方法来装填你希望移出的日期. 同一个 calendar 对象可以给多个 triggers 使用:
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
下节课介绍 triggers 的构造细节. 现在,只要知道上面的代码构造了两个 trigger, 每个都被调度为每天执行. 但是 calendar 会使他们跳过调度时间.
可以看看Quartz.Impl.Calendar 命名空间里有没有符合你需求的 ICalendar 实现.
« Lesson 3 | Lesson 5 »
原文