项目地址:
https://github.com/yuleiqq/quartz_example/tree/master/quartz_study
目录
如果您需要一个基于日历类概念(而不是基于SimpleTrigger的精确指定间隔)递归的作业触发计划,那么CronTrigger通常比SimpleTrigger更有用。
使用CronTrigger,您可以指定休假时间表,如“每周五中午”或“每个工作日和上午9:30”,甚至“一月期间每周一、周三和周五上午9:00到10:00之间每5分钟”。
即便如此,与SimpleTrigger一样,CronTrigger也有一个startTime,用于指定计划生效的时间,以及一个(可选的)endTime,用于指定计划应该停止的时间。
Cron 表达式
cron表达式用于配置CronTrigger实例。cron -表达式实际上是由七个子表达式组成的字符串,它们描述了调度的各个细节。这些子表达式用空格隔开,表示:
- Seconds
- Minutes
- Hours
- Day-of-Month
- Month
- Day-of-Week
- 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