这是翻译的官方教程,英语水平好的可以直接看官方原文:https://www.quartz-scheduler.net/documentation/quartz-3.x/tutorial/using-quartz.html
如果您需要在特定时间及时执行一次作业,或者在特定时间及之后按特定间隔重复执行,则SimpleTrigger应该能够满足您的日程安排需求。如果你想让触发器在2005年1月13日上午11点23分54秒触发,然后再触发5次,每10秒触发一次。
通过此描述,SimpleTrigger的属性包括:开始时间和结束时间,重复计数和重复间隔。所有这些属性都与您期望的完全相同,只有几个与结束时间属性相关的特殊注释。
重复计数可以是0,正整数或常数值SimpleTrigger.RepeatIndefinitely。重复间隔属性必须是TimeSpan.Zero或正的TimeSpan值。请注意,重复间隔为0会导致触发器的“重复计数”触发同时发生(或者与调度程序可以同时处理的同时发生)。
如果您还不熟悉DateTime类,则可能会发现它对计算触发器触发时间很有帮助,具体取决于您尝试创建的startTimeUtc(或endTimeUtc)。
EndTimeUtc属性(如果指定)覆盖重复计数属性。如果您希望创建一个触发器,例如每隔10秒触发一个触发器,直到某个特定时刻 - 而不必计算在开始时间和结束时间之间重复的次数,则此功能非常有用,您可以简单地指定结束时间,然后使用RepeatIndefinitely的重复次数(您甚至可以指定某个巨大数字的重复次数,肯定会比终止时间到达之前触发器实际触发的次数多。
SimpleTrigger实例使用TriggerBuilder(用于触发器的主属性)和WithSimpleSchedule扩展方法(用于SimpleTrigger特定的属性)构建。
在特定的时间内建立触发器,无需重复:
// 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();
在特定的时刻建立触发器,然后每十秒钟触发一次,重复十次:
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 = (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 = TriggerBuilder.Create()
.WithIdentity("trigger7", "group1")
.WithSimpleSchedule(x => x
.WithIntervalInMinutes(5)
.RepeatForever())
.EndAt(DateBuilder.DateOf(22, 0, 0))
.Build();
建立一个触发器,在下一个小时的顶部触发,然后每2小时重复一次:
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所定义的可用的方法,这样你可以熟悉可能在上面的例子没有提供给您的选项。
SimpleTrigger MisFire说明
SimpleTrigger有几条指令可用于通知Quartz.NET在发生MisFire时应该执行的操作。(关于MisFire的更多详情参照触发器章节)。这些指令被定义为MisfirePolicy.SimpleTrigger上的常量(包括描述其行为的API文档)。说明包括:
SimpleTrigger的MisFire常量
- MisfireInstruction.IgnoreMisfirePolicy
- MisfirePolicy.SimpleTrigger.FireNow
- MisfirePolicy.SimpleTrigger.RescheduleNowWithExistingRepeatCount
- MisfirePolicy.SimpleTrigger.RescheduleNowWithRemainingRepeatCount
- MisfirePolicy.SimpleTrigger.RescheduleNextWithRemainingCount
- MisfirePolicy.SimpleTrigger.RescheduleNextWithExistingCount
回顾前面章节可知所有触发器都有的MisfirePolicy.SmartPolicy可供使用,此指令是所有触发器类型的默认值。
如果使用’智能策略’指令,则SimpleTrigger会根据给定SimpleTrigger实例的配置和状态,在其各种MISFIRE指令之间动态选择。SimpleTrigger.UpdateAfterMisfire()方法的文档解释了这种动态行为的细节。
构建SimpleTriggers时,您可以将简单Schedule(通过SimpleSchedulerBuilder)指定为MisFire指令:
trigger = TriggerBuilder.Create()
.WithIdentity("trigger7", "group1")
.WithSimpleSchedule(x => x
.WithIntervalInMinutes(5)
.RepeatForever()
.WithMisfireHandlingInstructionNextWithExistingCount())
.Build();