如果您需要让作业在特定时刻只执行一次,或者在特定时刻然后以特定间隔重复执行,SimpleTrigger 应该可以满足您的调度需求。或者更简单的英语,如果您希望触发器在 2005 年 1 月 13 日上午 11:23:54 准确触发,然后每十秒再触发五次。

通过此描述,您可能不会惊讶地发现 SimpleTrigger 的属性包括:开始时间和结束时间、重复计数和重复间隔。所有这些属性都正是您所期望的,只有一些与结束时间属性相关的特殊说明。

重复计数可以是零、正整数或常量值 SimpleTrigger.RepeatIndefinitely。重复间隔属性必须是 TimeSpan.Zero 或正的 TimeSpan 值。请注意,重复间隔为零将导致触发器的“重复计数”触发同时发生(或接近于调度程序可以管理的同时发生)。

如果您还不熟悉 DateTime 类,您可能会发现它有助于计算触发触发时间,具体取决于您尝试创建的 startTimeUtc(或 endTimeUtc)。

EndTimeUtc 属性(如果已指定)覆盖重复计数属性。如果您希望创建一个触发器,例如每 10 秒触发一次直到给定时刻的触发器,这将很有用 - 而不必计算它在开始时间和结束时间之间重复的次数,您可以简单地指定结束时间,然后使用 RepeatIndefinitely 的重复计数(您甚至可以指定一些肯定超过触发器在结束时间到达之前实际触发的次数的巨大数字的重复计数) .

SimpleTrigger 实例是使用 TriggerBuilder(用于触发器的主要属性)和 WithSimpleSchedule 扩展方法(用于 SimpleTrigger 特定属性)构建的。

为特定时刻构建触发器,不重复:

  1. // trigger builder creates simple trigger by default, actually an ITrigger is returned
  2. ISimpleTrigger trigger = (ISimpleTrigger) TriggerBuilder.Create()
  3. .WithIdentity("trigger1", "group1")
  4. .StartAt(myStartTime) // some Date
  5. .ForJob("job1", "group1") // identify job with name, group strings
  6. .Build();

为特定时刻构建触发器,然后每十秒重复十次:

  1. ITrigger trigger = TriggerBuilder.Create()
  2. .WithIdentity("trigger3", "group1")
  3. .StartAt(myTimeToStartFiring) // if a start time is not given (if this line were omitted), "now" is implied
  4. .WithSimpleSchedule(x => x
  5. .WithIntervalInSeconds(10)
  6. .WithRepeatCount(10)) // note that 10 repeats will give a total of 11 firings
  7. .ForJob(myJob) // identify job with handle to its JobDetail itself
  8. .Build();

构建一个将在未来五分钟触发一次的触发器:

  1. ITrigger trigger = TriggerBuilder.Create()
  2. .WithIdentity("trigger5", "group1")
  3. .StartAt(DateBuilder.FutureDate(5, IntervalUnit.Minute)) // use DateBuilder to create a date in the future
  4. .ForJob(myJobKey) // identify job with its JobKey
  5. .Build();

构建一个立即触发的触发器,然后每五分钟重复一次,直到 22:00 小时:

  1. ITrigger 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();

构建一个将在下一小时开始触发的触发器,然后每 2 小时重复一次,直到永远:

  1. ITrigger trigger = TriggerBuilder.Create()
  2. .WithIdentity("trigger8") // because group is not specified, "trigger8" will be in the default group
  3. .StartAt(DateBuilder.EvenHourDate(null)) // get the next even-hour (minutes and seconds zero ("00:00"))
  4. .WithSimpleSchedule(x => x
  5. .WithIntervalInHours(2)
  6. .RepeatForever())
  7. // note that in this example, 'forJob(..)' is not called
  8. // - which is valid if the trigger is passed to the scheduler along with the job
  9. .Build();
  10. await scheduler.scheduleJob(trigger, job);

花一些时间查看 TriggerBuilder 定义的语言中的所有可用方法及其扩展方法 WithSimpleSchedule,以便您熟悉上面示例中可能未演示的可用选项。

SimpleTrigger 失火指令

SimpleTrigger 有几个指令可以用来通知 Quartz.NET 在发生失火时应该做什么。 (在本教程的更多关于触发器部分中介绍了失火情况)。这些指令被定义为 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 时,您将 misfire 指令指定为简单计划的一部分(通过 SimpleSchedulerBuilder):

  1. ITrigger trigger = TriggerBuilder.Create()
  2. .WithIdentity("trigger7", "group1")
  3. .WithSimpleSchedule(x => x
  4. .WithIntervalInMinutes(5)
  5. .RepeatForever()
  6. .WithMisfireHandlingInstructionNextWithExistingCount())
  7. .Build();