作为输入验证的一部分,我在想这是否是一个真正有效的 cron 表达式以及它将如何执行:
0 0/0 * * * ?
Quartz 验证返回 true
org.quartz.CronExpression.isValidExpression("0 0/0 * * * ?")
那么,这是否一直运行,从不,每小时或每分钟......?
作为输入验证的一部分,我在想这是否是一个真正有效的 cron 表达式以及它将如何执行:
0 0/0 * * * ?
Quartz 验证返回 true
org.quartz.CronExpression.isValidExpression("0 0/0 * * * ?")
那么,这是否一直运行,从不,每小时或每分钟......?
您可以使用TriggerUtils.computeFireTimesBetween()找到结果:
try {
CronTriggerImpl cron = new CronTriggerImpl();
cron.setStartTime(new Date());
cron.setCronExpression("0 0/0 * * * ?");
BaseCalendar calendar = new BaseCalendar();
List<Date> result = TriggerUtils.computeFireTimesBetween(cron, calendar, new Date(),DateBuilder.futureDate(1, IntervalUnit.DAY));
for (Date date : result) {
System.out.println(date);
}
} catch (ParseException e) {
e.printStackTrace();
}
输出是:
Thu Apr 05 18:00:00 CST 2012
Thu Apr 05 19:00:00 CST 2012
Thu Apr 05 20:00:00 CST 2012
Thu Apr 05 21:00:00 CST 2012
Thu Apr 05 22:00:00 CST 2012
Thu Apr 05 23:00:00 CST 2012
Fri Apr 06 00:00:00 CST 2012
Fri Apr 06 01:00:00 CST 2012
Fri Apr 06 02:00:00 CST 2012
Fri Apr 06 03:00:00 CST 2012
Fri Apr 06 04:00:00 CST 2012
.......................
因此,0 0/0 * * * ?
将在 0 分 0 秒时每小时运行一次。
根据CronTrigger 教程文档:
/
- 用于指定增量。例如,秒字段中的“0/15”表示“秒 0、15、30和 45 ”。而秒字段中的“5/15”表示“秒 5、20、35 和 50 ”。您还可以在 '' 字符之后指定 '/' - 在这种情况下,'' 相当于在 '/' 之前有 '0'。日期字段中的“1/3”表示“从该月的第一天开始每 3 天触发一次”。
这意味着0
在这种情况下实际上没有意义。然而CronExpression
似乎忽略它并简单地丢弃该值,有效地将这个表达式视为:
0 0 * * * ?
如果您好奇,这是丢弃无效0
值的代码:
if ((incr == 0 || incr == -1) && val != ALL_SPEC_INT) {
if (val != -1) {
set.add(Integer.valueOf(val));
} else {
set.add(NO_SPEC);
}
return;
}
CronTrigger文档中的更多信息。我的猜测是该表达式0 0/0 * * * ?
表示每小时一次(即0/0
不表示每分钟)。但是,如果您一直需要(即每秒),您可以使用* * * * ? *
.