CronTrigger 介绍

CronTrigger 介绍项目地址:https://github.com/yuleiqq/quartz_example/tree/master/quartz_study目录Cron表达式Cron表达式示例构建触发器如果您需要一个基于日历类概念(而不是基于SimpleTrigger的精确指定间隔)递归的作业触发计划,那么CronTrigger通常比SimpleTrigger更有用。…

CronTrigger

项目地址:  

    https://github.com/yuleiqq/quartz_example/tree/master/quartz_study

目录

Cron 表达式

Cron 表达式示例

构建触发器


如果您需要一个基于日历类概念(而不是基于SimpleTrigger的精确指定间隔)递归的作业触发计划,那么CronTrigger通常比SimpleTrigger更有用。

使用CronTrigger,您可以指定休假时间表,如“每周五中午”或“每个工作日和上午9:30”,甚至“一月期间每周一、周三和周五上午9:00到10:00之间每5分钟”。

即便如此,与SimpleTrigger一样,CronTrigger也有一个startTime,用于指定计划生效的时间,以及一个(可选的)endTime,用于指定计划应该停止的时间。

Cron 表达式

cron表达式用于配置CronTrigger实例。cron -表达式实际上是由七个子表达式组成的字符串,它们描述了调度的各个细节。这些子表达式用空格隔开,表示:

  1. Seconds
  2. Minutes
  3. Hours
  4. Day-of-Month
  5. Month
  6. Day-of-Week
  7. Year (optional field)

完整的cron表达式的一个例子是字符串“0 0 12 ? * WED” —— 意思是“每周三下午12点”。

单个子表达式可以包含范围和/或列表。例如,可以用“MON-FRI”、“MON,WED,FRI”甚至“MON-WED,SAT”代替前面示例中的“星期几”字段(读作“WED”)。

通配符(‘*’)可用于表示此字段的“每个”可能值。因此,前面示例中的“Month”字段中的“字符”仅表示“每个月”。因此,“星期几”字段中的“*”显然表示“一周中的每一天”。

所有字段都有一组可以指定的有效值。这些值应该相当明显——例如秒和分钟的数字0到59小时的数字 0到 23月日可以是任何值1-31,但是您需要注意一个月有多少天! 月可以指定值0到11之间,或通过使用字符串1月,2月,3月,4月,5月,6月,7月,8月,9月,10月,11月和12月Days-of-Week之间可以指定值1和7(1 = Sunday)或通过使用字符串的SUN, MON, TUE, WED, THU, FRI and SAT.

‘ / ‘ 字符可用于指定值的增量。例如,如果在分钟字段中输入“0/15”,它的意思是“每15分钟一次,从第0分钟开始”。如果您在分钟字段中使用“3/20”,那么它的意思是“每小时20分钟,从第3分钟开始”——或者换句话说,它与在分钟字段中指定“3,23,43”是一样的。请注意“/35”的微妙之处,并不是指“每35分钟”—而是指“一小时中的每35分钟,从第0分钟开始”—或者换句话说,与指定“0,35”相同。

‘?’  字符允许用于月日和周日字段它用于指定“无特定值”。当您需要在两个字段中的一个中指定某些内容,而不是在另一个字段中指定某些内容时,这是非常有用的。请参阅下面的示例(以及CronTrigger JavaDoc)进行说明。

“L”字符允许用于月日和周日字段这个字符是“last”的简写,但它在两个字段中的含义各不相同。例如,day-of-month字段中的值“L”表示“该月的最后一天”——1月31日,非闰年2月28日。如果单独用于星期几字段,它的意思是“7”或“SAT”。但是如果在星期几字段的另一个值之后使用,它的意思是“这个月的最后xxx天”——例如“6L”或“FRIL”都表示“这个月的最后一个星期五”。您还可以指定一个月最后一天的偏移量,例如“L-3”,它表示日历月的倒数第三天。在使用“L”选项时,不要指定列表或值的范围,这很重要,因为您会得到混淆/意外的结果。

“W”用于指定最接近给定日期的工作日(周一至周五)。例如,如果您要指定“15W”作为day-of-month字段的值,其含义是:“最接近该月15日的工作日”。

“#”用于指定每月的“第n个”XXX工作日。例如,“6#3”或“FRI#3”在星期几字段中的值表示“每月的第三个星期五”。

下面是一些关于表达式及其含义的示例—您可以在JavaDoc中找到更多关于org.quartz.CronExpression的示例

Cron 表达式示例

CronTrigger示例1—创建一个简单地每5分钟触发一次的触发器的表达式

“0 0/5 * * * ?”

CronTrigger示例2—创建一个触发器的表达式,该触发器每隔5分钟触发一次,在1分钟之后的10秒(即10:00:10 am, 10:05:10 am,等等)。

“10 0/5 * * * ?”

CronTrigger示例3 -用于创建触发器的表达式,该触发器在每周三和周五的10:30、11:30、12:30和13:30触发。

“0 30 10-13 ? * WED,FRI”

CronTrigger示例4—用于创建触发器的表达式,该触发器在每个月5日和20日上午8时至10时之间每半小时触发一次。请注意,触发器不会在上午10点,只是在8点,8点半,9点和9点半

“0 0/30 8-9 5,20 * ?”

请注意,有些调度要求过于复杂,无法用单个触发器来表示——例如“上午9点到10点之间每5分钟一次,下午1点到10点之间每20分钟一次”。此场景中的解决方案是简单地创建两个触发器,并将它们都注册到同一个作业中。

构建触发器

CronTrigger实例是使用TriggerBuilder(用于触发器的主要属性)和CronScheduleBuilder(用于特定于CronTrigger的属性)构建的。要在DSL风格中使用这些构建器,请使用静态导入:

import static org.quartz.TriggerBuilder.*;
import static org.quartz.CronScheduleBuilder.*;
import static org.quartz.DateBuilder.*:

每天早上8点到下午5点之间,每隔一分钟就设一个触发点:

 trigger = newTrigger()
    .withIdentity("trigger3", "group1")
    .withSchedule(cronSchedule("0 0/2 8-17 * * ?"))
    .forJob("myJob", "group1")
    .build();

建立一个触发器,每天上午10:42 执行:

 trigger = newTrigger()
    .withIdentity("trigger3", "group1")
    .withSchedule(dailyAtHourAndMinute(10, 42))
    .forJob(myJobKey)
    .build();

或者

trigger = newTrigger()
    .withIdentity("trigger3", "group1")
    .withSchedule(cronSchedule("0 42 10 * * ?"))
    .forJob(myJobKey)
    .build();

建立一个触发器,将在周三上午10:42分,指定一个时区: 

 trigger = newTrigger()
    .withIdentity("trigger3", "group1")
    .withSchedule(weeklyOnDayAndHourAndMinute(DateBuilder.WEDNESDAY, 10, 42))
    .forJob(myJobKey)
    .inTimeZone(TimeZone.getTimeZone("America/Los_Angeles"))
    .build();

或者


  trigger = newTrigger()
    .withIdentity("trigger3", "group1")
    .withSchedule(cronSchedule("0 42 10 ? * WED"))
    .inTimeZone(TimeZone.getTimeZone("America/Los_Angeles"))
    .forJob(myJobKey)
    .build();

CronTrigger的失败指令

以下说明可用于通知Quartz,当CronTrigger发生故障时,它应该做什么。(在本教程的More About trigger一节中介绍了失败的情况)。这些指令被定义为CronTrigger本身上的常量(包括描述其行为的JavaDoc)。说明书包括:

CronTrigger的指令常量失火

MISFIRE_INSTRUCTION_IGNORE_MISFIRE_POLICY
MISFIRE_INSTRUCTION_DO_NOTHING
MISFIRE_INSTRUCTION_FIRE_NOW

所有的触发器都有Trigger.MISFIRE_INSTRUCTION_SMART_POLICY指令 可以使用,该指令也是所有触发器类型的默认值。CronTrigger将“smart policy”指令解释为MISFIRE_INSTRUCTION_FIRE_NOW。JavaDoc 的CronTrigger.updateAfterMisfire()方法解释了这种行为的确切细节。

在构建crontrigger时,您可以指定misfire指令作为简单调度的一部分(通过CronSchedulerBuilder):

trigger = newTrigger()
    .withIdentity("trigger3", "group1")
    .withSchedule(cronSchedule("0 0/2 8-17 * * ?")
        ..withMisfireHandlingInstructionFireAndProceed())
    .forJob("myJob", "group1")
    .build();

 

今天的文章CronTrigger 介绍分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:http://bianchenghao.cn/32564.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注