回到顶部

Quartz.NET 2.x 文档翻译 - Lesson 6:CronTrigger触发模式

时间:2年前   作者:请喊我大龙哥   浏览:222   [站内原创,转载请注明出处]

Quartz.NET 2.x 文档翻译 - Lesson 6:CronTrigger触发模式 查看官网英文原文

返回目录

CronTriggers一般情况下比SimpleTrigger更加灵活和方便,如果我们需要按照日历日期来执行job而非按照固定的时间间隔来执行调度,那么肯定是CronTriggers更加合适了。

使用CronTrigger,我们可以设置执行时间点为“每星期五中午”,或“每周日上午9:30”,甚至可是是“每星期一星期三和星期五上午9:00点到午10:00每5分钟执行一次”。 

当然想SimpleTrigger一样,CronTrigger也有开始执行时间点,调度结束时间点等。

Cron Expressions

Cron表达式被用于配置CronTrigger实例,Cron表达式是一个7个子表达式组成的字符串,分别表示不同的调度时间点。这些子表达式之间以空格分割,分别表示:

  1. Seconds 秒
  2. Minutes 分
  3. Hours 时
  4. Day-of-Month 日
  5. Month 月
  6. Day-of-Week 周
  7. Year (optional field) 年
比如说:“0 0 12 ? * WED”这个表达式就是表示“每周三12点”的表达式。

单个子表达式可以包含范围和/或列表,比如,周字段可以是“MON-FRI”、“MON, WED, FRI”,甚至“MON-WED,SAT”也可以。

''字符可以用来标示任意值在节点中,比如上面例子Month节点说到的意义,意思就是任何月份,每个月。*字符在Day-Of—Week就表示周的每一天。

所有子节点都可以指定时间点,这些时间点必须是明确可用的,比如对于seconds分钟来说,我们可以写0-59这样的数字,对于hour小时来说,我们写0-23之间的数字,对于Day-of-Month来说就需要写0-31之间的数字,当然Day-of-Month的时候需要注意月份到底有多少天。对于Months来说就是0-11之间了,或者我们也可以使用JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV 和 DEC来表示月份,Days-of-Week的话就是1-7之间,当然也是可以使用SUN, MON, TUE, WED, THU, FRI 和 SAT。

/ 字符可以用来指定增量值,比如,如果我们把'0/15'填写在Minutes节点,意思就是从0分开始,每十五分钟支持一次,如果我们填写‘3/20’,意思就是从3分开始,每二十分钟执行一次,再解释下就是在一小时内,在3,23,43分钟的时候会执行。

? 字符允许day-of-month 和 day-of-week 的任一天,主要用于没有指定数值。当我们需要指定是哪个子节点的时候是有用的,一会看下面的例子来解释。

L 字符用于限定day-of-month 和 day-of-week,是last的简写,在两个子节点有不同的意义,比如day-of-month中意味着月份的最后一天,比如一月份的31,闰年二月份的28等,在 day-of-week 中意味着一周的最后一天7或者SAT。如果在day-of-week中使用数值+L的方式,这意思是月当中的最后一个数值天,比如6L或者FRIL,就是月中最后一个星期五,需要注意的是,如果我们使用了L参数,就不要在混合集合或者数值区间,这样会导致指定的日期混乱。

W 字符用于指定星期(星期一到星期五)工作日中最近的一天,比如我们要指定15w,意思就是当前月中最近的第十五个工作日。

# 字符用于指定月当中第几个工作日,比如day-of-week中设置6#3或者FRI#3,意思就是月当中第三个周五。

Example Cron Expressions

下面我们举些例子,更多的可以参考api文档查找

例子1 - 每间隔五分钟触发一次
"0 0/5 * * * ?"

例子2 - 每间隔五分钟的第10秒执行一次
"10 0/5 * * * ?"

例子3 - 每周3,周五的10:30, 11:30, 12:30和13:30执行
"0 30 10-13 ? * WED,FRI"

例子4 - 每月第五天和第二十天的 8:00, 8:30, 9:00 和 9:30执行

"0 0/30 8-9 5,20 * ?"

注意:有时候可能要求执行的调度比较复杂,那么简单方案就是我们进行拆分,将复杂的调度拆成多个触发器,并行即可。

Building CronTriggers

CronTrigger实例使用TriggerBuilder和WithCronSchedule扩展方法进行创建。

我们也可以使用CronScheduleBuilder 的静态方法创建调度。

例子1:每天上午8点到下午5点中,每2分钟执行一次
trigger = TriggerBuilder.Create()
    .WithIdentity("trigger3", "group1")
    .WithCronSchedule("0 0/2 8-17 * * ?")
    .ForJob("myJob", "group1")
    .Build();
例子2:每天10:42执行
// we use CronScheduleBuilder's static helper methods here
trigger = TriggerBuilder.Create()
    .WithIdentity("trigger3", "group1")
    .WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(10, 42))
    .ForJob(myJobKey)
    .Build();
也可以是:
trigger = TriggerBuilder.Create()
    .WithIdentity("trigger3", "group1")
    .WithCronSchedule("0 42 10 * * ?")
    .ForJob("myJob", "group1")
    .Build();
例子3:每周三10:42,在指定的时区内
trigger = TriggerBuilder.Create()
    .WithIdentity("trigger3", "group1")
    .WithSchedule(CronScheduleBuilder
        .WeeklyOnDayAndHourAndMinute(DayOfWeek.Wednesday, 10, 42)
        .InTimeZone(TimeZoneInfo.FindSystemTimeZoneById("Central America Standard Time")))
    .ForJob(myJobKey)
    .Build();
或者是:
trigger = TriggerBuilder.Create()
    .WithIdentity("trigger3", "group1")
    .WithCronSchedule("0 42 10 ? * WED", x => x
        .InTimeZone(TimeZoneInfo.FindSystemTimeZoneById("Central America Standard Time")))
    .ForJob(myJobKey)
    .Build();

CronTrigger Misfire Instructions

下面说的是在CronTrigger发生misfire的时候通知Quartz做什么,关于Misfire参照前面讲过的章节,这些指令都被定义为常量,指令主要有:
  1. MisfireInstruction.IgnoreMisfirePolicy
  2. MisfireInstruction.CronTrigger.DoNothing
  3. MisfireInstruction.CronTrigger.FireOnceNow

所有的triggers触发器和触发器类型都有MisfireInstrution.SmartPolicy通知指令,就是MisfireInstruction.CronTrigger.FireOnceNow,CronTrigger.UpdateAfterMisfire()方法的api详细解释了细节。

当我们创建CronTrigger的时候,misfire指令也是我们需要配置到调度信息中的(通过WithCronSchedule扩展方法):

trigger = TriggerBuilder.Create()
    .WithIdentity("trigger3", "group1")
    .WithCronSchedule("0 0/2 8-17 * * ?", x => x
        .WithMisfireHandlingInstructionFireAndProceed())
    .ForJob("myJob", "group1")
    .Build();

返回目录

请喊我大龙哥最后编辑于:2年前

内容均为作者独立观点,不代表八零IT人立场,如涉及侵权,请及时告知。

评论努力加载中...
暂无评论
暂无评论

手机扫码阅读

热门相关

加载中...
关于我们   联系我们   申请友链   赞助记录   站点地图
© 2014 - 2017 www.80iter.com All Rights Reserved. 京ICP备14042174号-1
本站遵循 CC BY 4.0 协议,转载请注明出处 。