以前都是将所有的内容放在一篇文章里,就会导致文章很长,对于学习的人来说,有时候这也是一个障碍。所以,以后我的写作习惯,我就会把我写的文章缩短,但是内容不会少,内容更集中。这样,学习起来也不会很累,很容易看完,也能记得住,不用记得那么多不相关的东西,学习效率也会越高。好了,开始今天的学习计划吧,今天我们要介绍的对象就是 SimpleTrigger。
一、SimpleTrigger 对象概述
如果您想要在特定时刻只执行一次作业,或者在特定时刻按特定时间间隔重复执行作业,则SimpleTrigger对象完全可以满足您的日程安排需求。或者用更简单的说,如果你想让触发器在2005年1月13日上午11:23:54开始激活,然后每隔10秒执行作业5次,这样的需求,就是 SimpleTrigger 最好的使用场景。
通过此描述,您可能对 SimpleTrigger 对象包含的以下这些属性并不会感到很惊讶,其属性包括:开始时间和结束时间、重复计数和重复间隔。所有这些属性都是您所期望的,只有几个与结束时间属性相关的需要特殊标注一下。
重复的次数可以是零,正整数或常量值SimpleTrigger.RepeatIndefinitely。 重复间隔属性必须是TimeSpan.Zero或正的TimeSpan值。 请注意,重复间隔为零将导致触发器的“重复计数”触发同时发生(或者与调度程序可以管理的同时接近)。
如果您还不熟悉DateTime类,那么根据要创建的startTimeUtc(或endTimeUtc),您可能会发现它对计算触发器触发时间很有帮助。
EndTimeUtc属性(如果已指定)覆盖重复次数属性。 如果您希望创建一个触发器,例如每隔10秒触发一次,直到给定的时刻 - 而不是必须计算它在开始时间和结束时间之间重复的次数,这可能很有用, 可以简单地指定结束时间,然后使用RepeatIndefinitely的重复计数(你甚至可以将重复次数设置为一个巨大数字,而且这个数字肯定会超过触发器在结束时间到来之前实际触发的次数)。
SimpleTrigger实例使用TriggerBuilder(针对触发器的主要属性)和WithSimpleSchedule扩展方法(针对SimpleTrigger特定属性)来构建。
1、在特定时刻构建触发器,不重复:
1 // TriggerBuilder默认创建简单触发器,实际上返回ITrigger 2 ISimpleTrigger trigger = (ISimpleTrigger) TriggerBuilder.Create() 3 .WithIdentity("trigger1", "group1") 4 .StartAt(myStartTime) // some Date 5 .ForJob("job1", "group1") //使用名称,组字符串识别作业 6 .Build();
2、在特定时刻构建触发器,然后每十秒重复十次:
1 trigger = TriggerBuilder.Create() 2 .WithIdentity("trigger3", "group1") 3 .StartAt(myTimeToStartFiring) // 如果没有给出开始时间(如果省略该行),则表示“现在” 4 .WithSimpleSchedule(x => x 5 .WithIntervalInSeconds(10) 6 .WithRepeatCount(10)) // 请注意,10次重复将总共触发11次 7 .ForJob(myJob) //使用JobDetail本身的句柄识别作业 8 .Build();
3、构建一个触发器,将在未来五分钟内触发:
1 trigger = (ISimpleTrigger) TriggerBuilder.Create() 2 .WithIdentity("trigger5", "group1") 3 .StartAt(DateBuilder.FutureDate(5, IntervalUnit.Minute)) // 使用DateBuilder在将来创建日期 4 .ForJob(myJobKey) // 用JobKey标识工作 5 .Build();
4、构建一个现在将触发的触发器,然后每五分钟重复一次,直到22:00:
1 trigger = TriggerBuilder.Create() 2 .WithIdentity("trigger7", "group1") 3 .WithSimpleSchedule(x => x 4 .WithIntervalInMinutes(5) 5 .RepeatForever()) 6 .EndAt(DateBuilder.DateOf(22, 0, 0)) 7 .Build();
5、构建一个触发器,在下一个小时的顶部触发,然后每2小时重复一次,永远:
1 trigger = TriggerBuilder.Create() 2 .WithIdentity("trigger8") //因为没有指定组,所以“trigger8”将位于默认组中。 3 .StartAt(DateBuilder.EvenHourDate(null)) // 得到下一个偶数小时(分钟和秒零(“00:00”)) 4 .WithSimpleSchedule(x => x 5 .WithIntervalInHours(2) 6 .RepeatForever()) 7 // 请注意,在此示例中,如果将触发器与作业一起传递给调度程序,则不会调用“forJob(..)” 8 .Build(); 9 10 await scheduler.scheduleJob(trigger, job);
花一些时间查看TriggerBuilder定义的语言及其扩展方法WithSimpleSchedule中的所有可用方法,以便您熟悉可用的选项,这些选项可能未在上面的示例中演示过。
二、SimpleTrigger 的 Misfire(激活失败) 介绍
SimpleTrigger有些指令可用于告知Quartz.NET发生激活失败时它应该做什么。(在本教程的“更多关于触发器”部分中介绍了激活失败(Misfire)的情况)。 这些指令在MisfirePolicy.SimpleTrigger上定义为常量(包括描述其行为的API文档)。 说明包括:
1、SimpleTrigger的Misfire(激活失败)指令常量
1)、MisfireInstruction.IgnoreMisfirePolicy
2)、MisfirePolicy.SimpleTrigger.FireNow
3)、MisfirePolicy.SimpleTrigger.RescheduleNowWithExistingRepeatCount
4)、MisfirePolicy.SimpleTrigger.RescheduleNowWithRemainingRepeatCount
5)、MisfirePolicy.SimpleTrigger.RescheduleNextWithRemainingCount
6)、MisfirePolicy.SimpleTrigger.RescheduleNextWithExistingCount
您应该从早期的课程中回忆一下,所有触发器都可以使用 MisfirePolicy.SmartPolicy 指令,并且此指令也是所有触发器类型的默认指令。
如果使用“智能策略”指令,SimpleTrigger 将根据给定SimpleTrigger实例的配置信息和状态在其各种 MISFIRE 指令之间动态选择。 SimpleTrigger.UpdateAfterMisfire()方法的文档的解释了此动态行为的具体的细节内容。
构建 SimpleTriggers 实例时,将 misfire 指令指定为 SimpleSchedule 的一部分(通过SimpleSchedulerBuilder):
1 trigger = TriggerBuilder.Create() 2 .WithIdentity("trigger7", "group1") 3 .WithSimpleSchedule(x => x 4 .WithIntervalInMinutes(5) 5 .RepeatForever() 6 .WithMisfireHandlingInstructionNextWithExistingCount()) 7 .Build();
三、总结
今天要写的内容完成了,但是并不代表 SimpleTrigger 的各个方面都介绍完了。其实还有很多内容没有说到,这就要靠大家自己的努力。有些人坑你还是很喜欢看原文,那我也把地址贴出来的。原文地址如下:https://www.quartz-scheduler.net/documentation/quartz-3.x/tutorial/simpletriggers.html
不忘初心,继续努力。