Quartz.NET c# Triggers

和 jobs 一样, triggers 用起来也简单, 但是也有一些定制化的选项需要了解, 否则很难充分发挥 Quartz.NET 的功能. 另外, 也有很多不同类型的 trigger, 可以满足各种 scheduling 需求.

Common Trigger Attributes

所有的trigger 类, 除了有唯一的 TriggerKey 属性外, 还有别的共同属性. 这些属性值在构造 trigger definition 的时候由 TriggerBuilder 来赋值 (底下例子里会介绍).

共有属性:

  • JobKey: 在 trigger 触发时, 用于唯一指示 trigger 对象.
  • StartTimeUtc: 指示何时该 trigger 第一次调度. 它的值是一个 DateTimeOffset 对象, 定义了日历时间上的一个时刻. 有些 trigger 类型, trigger 会在开始时就触发, 别的 trigger 会标记一个调度器启动时间. 这意味着你可以给 trigger 一个调度时间, 类似: "一月份第五天" , 如果 StartTimeUtc 的值是4月1号, 那就要等好几个月这个 trigger 才会触发.
  • EndTimeUtc: 指示何时起 trigger 不要再被调度执行. 也就是说 如果 trigger 的调度时间是 每个月五号, 且 EndTimeUtc 值是7月1号, 那么这个 trigger 的最后一次执行时间就是 6月5号.

其他的属性在下面详细讨论.

Priority

如果在你的 Quartz.Net 线程池里面有好些个工作线程, Quartz.NET 可能没有足够的资源来立刻执行被设置在同一个调度时间的 trigger. 这时你需要控制下 Quartz.NET 有空闲工作线程时, 哪个 trigger 会得到执行时间. 这就需要给 trigger 设置优先级. 如果你没有设置优先级, 那么默认值为5, 优先级上可以设置任何整数值, 整数或者负数都可以.

注意: 优先级的值只对同一时间执行的 trigger 有效. 调度时间早的 trigger 不管优先级多少都会比调度时间晚的 trigger 先执行.

注意: 当一个 trigger 被检测到需要恢复, 那它的优先级会恢复到同之前的优先级一样.

Misfire Instructions

misfire 的意思是一个 trigger 由于他的调度器被关掉以至于错过了它的触发时间, 或者因为在 Quartz.NET 线程池中没有可用的线程来执行 trigger 的 job. 不同的 trigger 类型都有他们各自的 misfire 指示器. 默认用 'smart policy' 指示器 - 它会根据 trigger 类型和配置来动态决定它自己的行为. 当调度器启动的时候
,它查找所有错过触发的 triggers, 然后根据他们各自配置的指示器来更新 triggers.

Calendars

Quartz.NET Calendar 对象实现了 ICalendar 接口,在 trigger 被存在调度器里的时候会和 trigger 关联起来. Calendars 可以用来从 trigger 的触发时间段中移出某一段特定的时间块. 例如, 你有个 trigger 在每个工作日的上午 9:30, 然后加了一个 Calendar 来移出所有的节假日.

Calendar 可以是任何实现了 ICalendar 接口的可序列化对象, 接口如下:

namespace Quartz
{
    public interface ICalendar
    {
        string Description { get; set; }

        ICalendar CalendarBase { set; get; }

        bool IsTimeIncluded(DateTimeOffset timeUtc);

        DateTime GetNextIncludedTimeUtc(DateTimeOffset timeUtc);
    }
} 

虽然 calendarEven 可以移出小到毫秒的时间段,当时通常你可能希望移出掉整天的时间,为了方便, Quartz.NET 定义了一个HolidayCalendar类.

Calendars 必须初始化并用 AddCalendar() 注册到 scheduler. 对于 HolidayCalendar, 在初始化后, 你需要用它的AddExcludedDate(DateTime date) 方法来装填你希望移出的日期. 同一个 calendar 对象可以给多个 triggers 使用:

Calendar Example

    HolidayCalendar cal = new HolidayCalendar();
    cal.AddExcludedDate(someDate);

    sched.AddCalendar("myHolidays", cal, false);

    ITrigger t = TriggerBuilder.Create()
        .WithIdentity("myTrigger")
        .ForJob("myJob")
        .WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(9, 30)) // execute job daily at 9:30
        .ModifiedByCalendar("myHolidays") // but not on holidays
        .Build();

    // .. schedule job with trigger

    ITrigger t2 = TriggerBuilder.Create()
        .WithIdentity("myTrigger2")
        .ForJob("myJob2")
        .WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(11, 30)) // execute job daily at 11:30
        .ModifiedByCalendar("myHolidays") // but not on holidays
        .Build();

    // .. schedule job with trigger2 

下节课介绍 triggers 的构造细节. 现在,只要知道上面的代码构造了两个 trigger, 每个都被调度为每天执行. 但是 calendar 会使他们跳过调度时间.

可以看看Quartz.Impl.Calendar 命名空间里有没有符合你需求的 ICalendar 实现.


转载:点击打开链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值