2

入力検証の一環として、これが本当に有効な cron 式であり、どのように実行されるかを考えていました。

0 0/0 * * * ?

Quartz 検証が true を返す

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

それで、これは常に実行されますか、決して実行されませんか、毎時間または毎分...?

4

3 に答える 3

7

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 * * * ?は1時間ごとに0分0秒で実行されます。

于 2012-04-05T09:25:47.027 に答える
3

CronTrigger チュートリアルのドキュメントによると:

  • /- 増分を指定するために使用されます。たとえば、秒フィールドの「0/15」は、「0、15、30 、および 45 秒」を意味します。また、秒フィールドの「5/15」は、「5、20、35 、および 50 秒」を意味します。'' 文字の後に '/' を指定することもできます。この場合、'' は '/' の前に '0' があることと同じです。day-of-month フィールドの '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;
    }
于 2012-04-05T09:15:19.123 に答える
1

詳細については、CronTrigger のドキュメントを参照してください。私の推測では、この式は1 時間に 1 回0 0/0 * * * ?という意味です(つまり、1 分ごとを意味するわけではありません)。ただし、常に (つまり毎秒) 必要な場合は、 を使用できます。0/0* * * * ? *

于 2012-04-05T07:58:07.477 に答える