如果你只需要你的 job 在某个特定的时刻执行一次, 或者在某一个时刻重复执行几遍, SimpleTrigger 完美解决你的需求.
SimpleTrigger 的属性包括以下几点: start-time, end-time, repeat count, 以及 repeat interval.
repeat count 可以是0或者正整数, 或者 SimpleTrigger.RepeatIndefinitely. repeat interval 可以是 TimeSpan.Zero, 正的 TimeSpan 值. 如果 repeat interval 值为 0, 那么意味着每次触发都是同时发生的(或者调度器能达到的最大限度的同时).
如果你对 DateTime 类还不熟悉, 你可能需要根据你的 trigger 的 startTimeUtc 和 endTimeUtc 来计算下你的 trigger 的触发时间.
EndTimeUtc 属性可以中断 repeat count. 如果你想要一个在某一个特定时刻前每 10 秒钟运行一次的 trigger, 这个属性就很有用处了 - 你不需要自己去计算在结束时间到达之前应该重复执行几遍, 你可以简单地指定 end-time 然后 repeat count 设为 RepeatIndefinitely (甚至你可以把 repeat count 时间设为比剩余的执行时间长的值就可以了).
SimpleTrigger 实例由 TriggerBuilder 来构造(填充主要的属性值) 然后 WithSimpleSchedule 拓展方法来填充 SimpleTrigger 子类的属性值.
构造一个在特定时间执行,无重复的 trigger:
// trigger builder creates simple trigger by default, actually an ITrigger is returned
ISimpleTrigger trigger = (ISimpleTrigger) TriggerBuilder.Create()
.WithIdentity("trigger1", "group1")
.StartAt(myStartTime) // some Date
.ForJob("job1", "group1") // identify job with name, group strings
.Build();
构造一个在特定时间执行, 没10秒重复一次的 trigger:
trigger = TriggerBuilder.Create()
.WithIdentity("trigger3", "group1")
.StartAt(myTimeToStartFiring) // if a start time is not given (if this line were omitted), "now" is implied
.WithSimpleSchedule(x => x
.WithIntervalInSeconds(10)
.WithRepeatCount(10)) // note that 10 repeats will give a total of 11 firings
.ForJob(myJob) // identify job with handle to its JobDetail itself
.Build();
构造一个在接下来的五分钟内执行一次的 trigger:
trigger = (ISimpleTrigger) TriggerBuilder.Create()
.WithIdentity("trigger5", "group1")
.StartAt(DateBuilder.FutureDate(5, IntervalUnit.Minute)) // use DateBuilder to create a date in the future
.ForJob(myJobKey) // identify job with its JobKey
.Build();
构造一个立刻执行, 然后在 22:00 前每五分钟重复一次的 trigger:
trigger = TriggerBuilder.Create()
.WithIdentity("trigger7", "group1")
.WithSimpleSchedule(x => x
.WithIntervalInMinutes(5)
.RepeatForever())
.EndAt(DateBuilder.DateOf(22, 0, 0))
.Build();
构造一个在下一个小时开始时执行,然后每两小时执行一次,永远执行的 trigger:
trigger = TriggerBuilder.Create()
.WithIdentity("trigger8") // because group is not specified, "trigger8" will be in the default group
.StartAt(DateBuilder.EvenHourDate(null)) // get the next even-hour (minutes and seconds zero ("00:00"))
.WithSimpleSchedule(x => x
.WithIntervalInHours(2)
.RepeatForever())
// note that in this example, 'forJob(..)' is not called
// - which is valid if the trigger is passed to the scheduler along with the job
.Build();
scheduler.scheduleJob(trigger, job);
花点时间查看 TriggerBuilder 和它的拓展方法里面定义的所有可用的方法,也许你会发现一些你需要但是没在上面的例子中列出来的选项.
SimpleTrigger Misfire Instructions
SimpleTrigger 有几个指示器来告诉 Quartz.NET 触发失败时的操作. (触发失败在上一节课介绍 Trigger 里面有讲). 这些指示器定义在常量 MisfirePolicy.SimpleTrigger 里面, 包括:
- MisfireInstruction.IgnoreMisfirePolicy
- MisfirePolicy.SimpleTrigger.FireNow
- MisfirePolicy.SimpleTrigger.RescheduleNowWithExistingRepeatCount
- MisfirePolicy.SimpleTrigger.RescheduleNowWithRemainingRepeatCount
- MisfirePolicy.SimpleTrigger.RescheduleNextWithRemainingCount
- MisfirePolicy.SimpleTrigger.RescheduleNextWithExistingCount
你应该还记得在前面的教程中提到过所有的 trigger 都有 MisfirePolicy.SmartPolicy 指示器, 它也是所有 trigger 的默认指示器.
如果 'smart policy' 是当前正在使用的指示器, SimpleTrigger 会根据它当前的配置和状态在他的指示器里面动态地选择一个. SimpleTrigger.UpdateAfterMisfire() 方法文档解释了这个动态行为的细节.
构造 SimpleTriggers 时, 你可以给 simple schedule 指定一个指示器:
trigger = TriggerBuilder.Create()
.WithIdentity("trigger7", "group1")
.WithSimpleSchedule(x => x
.WithIntervalInMinutes(5)
.RepeatForever()
.WithMisfireHandlingInstructionNextWithExistingCount())
.Build();
转载:点击打开链接