Cron表达式:“/”与步增

本文探讨了使用Quartz工具包获取Cron表达式下次执行时间时遇到的问题,并非实现简单的每隔固定时间间隔执行,而是遵循特定的周期模式。文中详细解释了Cron表达式的工作原理及如何通过其他方式如Spring Scheduled或Calendar实现精确的时间间隔调度。

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

问题陈述

在使用quartz工具包来获取cron表达式的下次执行时间时,发现增量的功能和预期不一致,并不是“每隔多少秒”。而是“从x秒开始每隔多少秒执行一次,当达到最大值后再次从x秒开始”,并不能基于一个beginTime和cron做持续步增。

获取的方法如下

CronTriggerImpl cronTriggerImpl = new CronTriggerImpl();
try {
    cronTriggerImpl.setCronExpression(cronExpression);
    cronTriggerImpl.setStartTime(beginTime);
    cronTriggerImpl.setEndTime(endTime);
    Date date = cronTriggerImpl.getFireTimeAfter(baseTime);
} catch (ParseException e) {
}

Cron表达式是:

*/7 * * * * ?

获取的结果是:

16:12:00,16:12:07,16:12:14,16:12:21,16:12:28,16:12:35,16:12:42,16:12:49,
16:12:56,
16:13:00,
16:13:07,
16:13:14,16:13:21,16:13:28,16:13:35,16:13:42,16:13:49,16:13:56,16:14:00,16:14:07

具体的原因如下

其实cron表达式”*/7 * * * * ?”等价于”0/7 * * * * ?”

分析CronTriggerImpl和CronExpression的buildExpression、storeExpressionVals、addToSet等方法可知:

步增量a/b处理过程如下:

1,步增量为b,步增的起始值为a(默认值为0*也是0)。

2,依据起始值,步增值,该位置的最大值生成一个TreeSet,保存该位置的可取值。

在生成可执行时间时,由这些时间组合形成。所以cron在该位置的取值是固定的几个值。

解决方案:

1Spring Scheduled

@Scheduled(fixedRate = 9000)
从启动起,每9000ms执行一次

2,基于Calendar计算

Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(time);
cal.add(Calendar.MILLISECOND,90000); 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值