Quartz.NET c# SimpleTrigger

如果你只需要你的 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();


转载:点击打开链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值