Quartz 简单触发器
如果您需要在特定时间精确执行一次作业,或者在特定时间后按特定间隔重复执行,简单触发器(SimpleTrigger)应该能满足您的调度需求。更通俗地说,如果您希望触发器在 2005 年 1 月 13 日上午 11:23:54 准确触发,随后再以每十秒的间隔重复五次。
根据这个描述,您可能不会惊讶地发现简单触发器的属性包括:开始时间、结束时间、重复次数和重复间隔。所有这些属性都正如您预期的那样,只是与结束时间属性相关的几点特殊说明。
重复次数可以是零、正整数或常量值 SimpleTrigger.RepeatIndefinitely
。重复间隔属性必须是 TimeSpan.Zero
或正的 TimeSpan
值。请注意,重复间隔为零会导致触发器的“重复次数”同时触发(或尽可能接近同时,取决于调度器的管理能力)。
如果您还不熟悉 DateTime
类,根据您试图创建的 startTimeUtc(或 endTimeUtc),您可能会发现它有助于计算触发器的触发时间。
如果指定了 EndTimeUtc
属性,则它会覆盖重复次数属性。这在您希望创建触发器时很有用,比如每隔 10 秒触发一次直到给定的某个时间点,而不是必须计算在开始时间和结束时间之间重复的次数,您可以直接指定结束时间,然后使用重复次数为 RepeatIndefinitely
(您甚至可以指定一个肯定大于触发器在结束时间到达之前实际触发次数的巨大数字作为重复次数)。
简单触发器实例是使用 TriggerBuilder
(用于触发器的主要属性)和 WithSimpleSchedule
扩展方法(用于简单触发器特定的属性)构建的。
构建一个在特定时间触发且不重复的触发器:
// 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();
构建一个在特定时间触发,然后每十秒重复十次的触发器:
ITrigger 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();
构建一个在未来五分钟触发一次的触发器:
ITrigger trigger = 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 的触发器:
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("trigger7", "group1")
.WithSimpleSchedule(x => x
.WithIntervalInMinutes(5)
.RepeatForever())
.EndAt(DateBuilder.DateOf(22, 0, 0))
.Build();
构建一个在下一小时的顶部触发,然后每两小时重复,永远重复的触发器:
ITrigger 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();
await scheduler.scheduleJob(trigger, job);
花些时间浏览 TriggerBuilder
语言中定义的所有可用方法及其扩展方法 WithSimpleSchedule
,以便熟悉可能在上述示例中未展示的选项。
简单触发器的误触发指令
简单触发器有几种指令,可用于告知 Quartz.NET 在发生误触发时应采取的操作。(误触发情况在本教程的 关于触发器的更多内容部分引入)。这些指令定义在 MisfirePolicy.SimpleTrigger
上(包括描述其行为的 API 文档)。这些指令包括:
简单触发器的误触发指令常量
MisfireInstruction.IgnoreMisfirePolicy
MisfirePolicy.SimpleTrigger.FireNow
MisfirePolicy.SimpleTrigger.RescheduleNowWithExistingRepeatCount
MisfirePolicy.SimpleTrigger.RescheduleNowWithRemainingRepeatCount
MisfirePolicy.SimpleTrigger.RescheduleNextWithRemainingCount
MisfirePolicy.SimpleTrigger.RescheduleNextWithExistingCount
您应该记得,在之前的课程中,所有触发器都有可用的 MisfirePolicy.SmartPolicy
指令,这也是所有触发器类型的默认指令。
如果使用 “智能策略” 指令,简单触发器将根据给定 SimpleTrigger 实例的配置和状态动态选择其各种 MISFIRE 指令。SimpleTrigger.UpdateAfterMisfire()
方法的文档解释了这种动态行为的确切细节。
构建 SimpleTriggers 时,您通过 SimpleSchedulerBuilder
作为简单调度的一部分指定误触发指令:
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("trigger7", "group1")
.WithSimpleSchedule(x => x
.WithIntervalInMinutes(5)
.RepeatForever()
.WithMisfireHandlingInstructionNextWithExistingCount())
.Build();