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();

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值