Quartz 里的触发器及Cron 表达式

Quartz 的设计允许作业与作业调度分离。将作业与作业调度的分离通过触发器完成,
Quartz 中的触发器用来确定作业的触发时机,其框架提供了一系列触发器类型,但以下
两个是最常用的:
• SimpleTrigger 。
• CronTrigger 。
SimpleTrigger 主要用于简单的调度。例如,如果需要在给定的时间内重复执行作业,
或者间隔固定时间执行作业,可以选择SimpleTrigger 0 SimpleTrigger 类似与JDK 的Timer 。
如果需要更复杂的作业调度,则可以考虑使用CronTrigger 。该调度器基于
Calendar-like 调度。当需要在除星期六和星期日以外的每天上午10: 30 执行作业时,就
应使用CronTrigger 0 CronTrigger 是基于Unix Cron 的表达式。
Cron 表达式是一个字符串,字符串以5 个或6 个空格隔开,分成6 个或7 个域,每
个域代表一个时间域, Cron 表达式有如下两种语法格式。
Seconds Minutes Hours DayofMonth Month DayotWeek ¥ear 。
上面是包含7 个域的表达式,还有只包含6 个域的Cron 表达式。
Seconds Minutes Hours DayofMonth Month DayotWeek
每个域可出现的字符如下。
• Second: 可出现, - * /四个字符,有效范围为0-59 的整数。
• Minutes: 可出现, - * /四个字符,有效范围为0-59 的整数。
• Hours: 可出现, - * /四个字符,有效范围为0-23 的整数。
• DayofMonth: 可出现, -*?/LWC 八个字符,有效范围为1-31 的整数。
• Month: 可出现, - * /四个字符,有效范围为1-12 或JAN-DEC 。
• DayotWeek: 可出现, -*?/LC# 八个字符,有效范围为1-7 或
SUN-SAT 两个范围。其中1 表示星期日, 2 表示星期一,依次类推。
• Year: 可出现, - * /四个字符,有效范围为1970-2099 年。
每个域通常都使用数字,但还可以出现如下特殊字符,它们的含义如下。
• * :表示匹配该域的任意值,假如在Minutes 域使用*,即表示在每分钟都会触发
事件。
518
完整应用2 简单工作流系统
• ? :只能用在DayotMonth 和DayofWeek 两个域。它也匹配该域的任意值,但实
际应用中则不会,因为DayOtMonth 和DayofWeek 会互相影响。例如,想在每月
的20 日触发调度,无论20 日是星期几,则只能使用如下写法: 13 13 15 20 * ?,
其中最后→位只能使用?,而不能使用*,如果使用*则表示无论星期几都会触发,
但实际并不是这样。
• - :表示范围。例如,在Minutes 域使用5-20 ,表示从5 分钟到20 分钟内每分钟
触发一次。
• I : 表示从起始时间开始触发,然后每隔固定时间触发一次。例如,在Minutes
域使用5/20 , 则意味着5 分钟触发一次,而在25 , 45 等分钟时分别触发一次。
·,:表示列出枚举值。例如,在Minutes 域使用5 , 20 ,则意味着在5 和20 分钟
分别触发一次。
• L :表示最后。只能出现在DayofWeek 和DayotMonth 域,如果在DayofWeek 域
使用丸,则意味着在最后一个星期四触发。
·W: 表示有效工作日(星期二到星期五)。只能出现在DayotMonth 域,系统将
在离指定日期最近的有效工作日触发事件。例如,在DayotMonth 使用5W ,如果
5 日是星期六,则将在最近的工作日星期一,即4 日触发。如果5 日是星期一到
星期五中的一天,则就在5 日触发。须注意的是, W 不会跨月寻找,例如, lW,
1 日恰好是星期六,系统不会在上月的最后一天触发,而是到3 日触发。
• LW: 这两个字符可以连接使用,表示某个月最后→个工作日,即最后一个星期五。
• # :用于确定每个月的第几个星期几,只能出现在DayotMonth 域。如在4#5 ,
表示某月的第五个星期三。
下面的Quartz Cron 表达式,表示在周一到周五的每天上午10: 15 分开始执行作业。
o 15 10 ? * MON-FRI
下面的表达式,表示在2002-2005 年中的每个月的最后一个星期五上午10: 15 分
开始执行作业。
o 15 10 ? * 6L 2002-2005
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是的,Quartz支持动态调整cron表达式。你可以通过以下骤来实现: 1. 获取`Scheduler`对象,可以通过注入`SchedulerFactoryBean`或者使用`SchedulerFactory.getDefaultScheduler()`方法获取。 2. 使用`TriggerKey`或者`JobKey`来获取对应的触发器或任务。 3. 使用`CronScheduleBuilder`来创建新的cron表达式。 4. 调用`TriggerBuilder`的`withSchedule()`方法,将新的cron表达式设置给触发器。 5. 调用`Scheduler`的`rescheduleJob()`方法,传入原有的触发器key和新的触发器对象,完成动态调整。 以下是一个示例代码: ```java @Autowired private Scheduler scheduler; public void updateCronExpression(String triggerName, String cronExpression) throws SchedulerException { TriggerKey triggerKey = TriggerKey.triggerKey(triggerName); CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey); if (trigger == null) { // 触发器不存在,处理相应的逻辑 return; } CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression); trigger = trigger.getTriggerBuilder() .withIdentity(triggerKey) .withSchedule(cronScheduleBuilder) .build(); scheduler.rescheduleJob(triggerKey, trigger); } ``` 在上述示例,我们通过注入`Scheduler`对象来进行调度器的操作。然后,通过`TriggerKey`获取到需要更新的触发器对象,使用新的cron表达式创建一个新的触发器对象,并通过调用`rescheduleJob()`方法来替换原有的触发器。 请注意,这只是一个示例,具体的实现需要根据你的业务需求进行调整。另外,动态调整cron表达式可能会对调度器产生一定的影响,需要谨慎使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值