【问题标题】:Quartz cron expression of 0/00/0 的 Quartz cron 表达式
【发布时间】:2012-04-18 22:55:45
【问题描述】:

作为输入验证的一部分,我在想这是否是一个真正有效的 cron 表达式以及它会如何执行:

0 0/0 * * * ?

Quartz 验证返回 true

org.quartz.CronExpression.isValidExpression("0 0/0 * * * ?")

那么,这是否一直运行,从不,每小时或每分钟......?

【问题讨论】:

    标签: java quartz-scheduler cronexpression


    【解决方案1】:

    您可以使用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 秒运行。

    【讨论】:

      【解决方案2】:

      根据CronTrigger Tutorial 文档:

      • / - 用于指定增量。例如,秒字段中的“0/15”表示“秒 0、15、30 和 45”。而秒字段中的“5/15”表示“第 5、20、35 和 50 秒”。您还可以在 '' 字符之后指定 '/' - 在这种情况下,'' 相当于在 '/' 之前有 '0'。日期字段中的“1/3”表示“从该月的第一天开始每 3 天触发一次”。

      这意味着0 在这种情况下实际上没有意义。然而CronExpression 似乎忽略了它并简单地丢弃该值,有效地将这个表达式视为:

      0 0 * * * ?
      

      如果你好奇,this is the code 会丢弃无效的0 值:

          if ((incr == 0 || incr == -1) && val != ALL_SPEC_INT) {
              if (val != -1) {
                  set.add(Integer.valueOf(val));
              } else {
                  set.add(NO_SPEC);
              }
      
              return;
          }
      

      【讨论】:

        【解决方案3】:

        更多信息参见CronTrigger 文档。我的猜测是表达式0 0/0 * * * ? 表示每小时一次(即0/0 并不表示每一分钟)。但是,如果您一直需要(即每秒),您可以使用* * * * ? *

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-05
          • 2021-07-17
          • 1970-01-01
          相关资源
          最近更新 更多