【发布时间】:2015-03-16 10:41:59
【问题描述】:
我想要一个每 45 分钟触发一次的 cron 表达式。
根据文档,我创建了这个0 0/45 * * * ? 表达式。
但它以 12:00、12:45、13:00、13:45、14:00 等模式触发。
但我期望和想要的是在 12:00、12:45、13:30、14:15 被解雇。
我错过了什么?
【问题讨论】:
标签: cron quartz.net
我想要一个每 45 分钟触发一次的 cron 表达式。
根据文档,我创建了这个0 0/45 * * * ? 表达式。
但它以 12:00、12:45、13:00、13:45、14:00 等模式触发。
但我期望和想要的是在 12:00、12:45、13:30、14:15 被解雇。
我错过了什么?
【问题讨论】:
标签: cron quartz.net
Cron 并非旨在解决此类问题。它定义了必须触发触发器的确切日期和时间,而不是时间间隔。请改用简单的时间表:
TriggerBuilder.Create()
.StartAt(startDate)
.WithSimpleSchedule(
simpleScheduleBuilder => simpleScheduleBuilder.WithIntervalInMinutes(45))
.Build();
编辑: 可以是上面的简单调度,也可以是多个 cron 触发器(Quartz 作业可以有多个触发器):
0 0/45 12/3 * * ? # 12:00, 12:45, 15:00, 15:45, ...
0 30 13/3 * * ? # 13:30, 16:30, ...
0 15 14/3 * * ? # 14:15, 17:15, ...
【讨论】:
0 0/45 * * * ? 实际上的意思是“每 45 分钟开火一次,从每小时的第 0 分钟开始”。
您声称您当前的输出是 12:00, 12:45, 13:00, 13:45, 14:30,除了最后一次是 14:30 之外,这是有道理的。
该作业在一小时开始 (12:00) 触发,45 分钟后再次触发 (12:45),然后重复,从第 0 分钟 (13:00) 开始触发下一个作业,然后在整点 45 分钟 (13:45) 再次触发。
我不确定为什么它会在 14:30 突然开始触发,但如果你将 cron 输入更改为
0 45 * * * ?我相信它会按照你的意愿工作,每 45 分钟发射一次。
【讨论】:
这是一种可能对您有所帮助的解决方法。每 15 分钟创建一个计时器
0 0/15 * * * ? *
并保留一个充当计数器的变量,并在每次触发计时器时递增。当计数器达到 3 时,触发您的方法并将计数器重置为 0。希望这对来到这里寻找答案的人有所帮助!
【讨论】:
如果需要,您可以将间隔更改为 */15。但这实际上每 45 分钟运行一次:
* * * * * (( $(( $(date '+(\%M+\%H*60)')\%45 )) )) || date >> /tmp/cron_45.out 2>&1
【讨论】: