【6】CronTrigger

本文介绍了Quartz中的CronTrigger机制,包括如何通过Cron-Expressions指定复杂的触发规则,例如每周三中午12点触发等。文章还展示了如何利用TriggerBuilder和CronScheduleBuilder创建CronTrigger实例,并提供了处理misfire的策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考链接:
http://www.quartz-scheduler.org/documentation/quartz-2.2.x/tutorials/tutorial-lesson-06.html
CronTriggerSimpleTrigger 更加有用,通过CronTrigger 可以指定firing-schedules , 比如”每个周五的中午”、”每个工作日的上午9:30”、”一月的每周一、周三和周五上午9:00至10:00的每个5分钟”。

SimpleTrigger 一样,CronTrigger 可以通过startTime 指定什么时间schedule开始调度执行,可选的endTime 指定schedule什么时候应该停止。

Cron Expressions

Cron-Expressions 是用来配置CronTrigger实例的,Cron-Expressions是由7个子表达式组成的字符串,子表达式由空格分开,分别是:

  1. 秒(Seconds)
  2. 分(Minutes)
  3. 小时(Hours)
  4. 日(Day-of-Month)
  5. 月(Month)
  6. 周几(Day-of-Week)
  7. 年(Year, 可选字段)

比如0 0 12 ? * WED, 表示每周三的下午12点。 周几字段还可以是MON-FRIMON,WED,FRI,或者MON-WED,SAT。 这里的*可以表示成每个月,如果*周几字段上可以表示成每周的每一天。

字段名允许的值允许的特殊字符
0-59, - * /
0-59, - * /
小时0-23, - * /
1-31, - * ? / L W C
0-11 or JAN-DEC, - * /
周几1-7(1=Sunday) or SUN-SAT, - * ? / L C #
empty, 1970-2099, - * /

“?”字符:表示没有特定的值,在”日”字段和”周几”字段中使用,在这两个字段中只能在其中一个字段上使用。

“,”字符:指定数个值

“-”字符:指定一个值的范围

“/”字符:用在指定一个值的增加幅度。n/m表示从n开始,每次增加m。
比如在分的字段使用 “0/15”, 表示一个小时的每一个15分钟,从0分开始。继续在分字段使用使用”3/20”, 表示一个小时的每20分钟,从第3分开始(和使用”3,23,43”一样)。如果是”/35”就不是表示每35分钟了,表示从0开始,一小时的第35分钟,和指定”0,35”一样。

“L”字符:用在”日”字段和”周几”字段里,”日”字段表示一个月中的最后一天(比如1月的31号),用在”周几”字段表示该周最后一天周六(7或者SAT)。如果是”L”前有具体的内容, 那就具有其他的含义了,比如在”周几”字段中的”6L”或者”FRIL”都表示本月的最后一个星期五。还可以为L设置偏移值,如在”日”字段使用”L-3”,若现在是9月份,这里就表示9月的28号,提前了3天。注意:在使用“L”参数时,不要指定列表或范围,因为这会导致问题。

“W”字符:指定离 给定日期 最近的工作日(周一到周五),比如在”日”字段指定”15W”, 表示 离本月15号最近的工作日。

“#”字符:用在”周几”字段,表示该月第几个周X,6#3表示该月第3个周五。

“*”:代表所有可能值

Example Cron Expressions

0 0/5 * * * ?: 每隔5分钟执行一次

0 5/15 0-23 * * *: 从5分开始,每15分钟执行一次,到了最后一次执行时间正好是23:50

10 0/5 * * * ?: 每5分钟执行一次,比如10:00:10 am, 10:05:10 am

0 30 10-13 ? * WED,FRI: 在周三和周五的10:30, 11:30, 12:30和13:30执行

0 0/30 8-9 5,20 * ?: 每个月的5号和20号的上午8点到9点每半小时执行一次

对于一些特殊的需求,比如上午的9点到10点每5分钟执行一次,然后下午的1点和10点每20分钟执行一次,这种情况下可以创建两个triggers,将这两个triggers注册到schedule中,去运行同一个job。

Building CronTriggers

CronTrigger实例可以通过TriggerBuilder(多数主要的属性都有)和CronScheduleBuilder(指定CronTrigger的属性)。可以导入其的静态方法:

import static org.quartz.TriggerBuilder.*;
import static org.quartz.CronScheduleBuilder.*;
import static org.quartz.DateBuilder.*:
创建一个每天上午8点到下午17点每两分钟触发一次的trigger(17点以后、18点以前也会执行)
 trigger = newTrigger()
    .withIdentity("trigger3", "group1")
    .withSchedule(cronSchedule("0 0/2 8-17 * * ?"))
    .forJob("myJob", "group1")
    .build();
创建一个每天上午10:42执行的trigger
 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,使用系统默认的时区

 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 Misfire Instructions

下面的instructions可以用来通知quartz当misfire出现的时候应该做些什么,主要是针对CronTrigger的。下面的这些定义在CronTrigger中的instructions常量:

MISFIRE_INSTRUCTION_IGNORE_MISFIRE_POLICY
MISFIRE_INSTRUCTION_DO_NOTHING
MISFIRE_INSTRUCTION_FIRE_NOW

所有的trigger都默认有了Trigger.MISFIRE_INSTRUCTION_SMART_POLICY instruction,
CronTrigger 将smart policy执行为MISFIRE_INSTRUCTION_FIRE_NOW,JavaDoc 对CronTrigger.updateAfterMisfire()的行为有详尽的解释。

创建CronTrigger,指定misfire instruction:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值