TL;DR
Quartz 1 では、この cron: 59 59 23 31 12 ? 2099
(最後の有効な日付) を使用できます。
Quartz 2 では、次の cron を使用できます。0 0 0 1 1 ? 2200
遠い未来の表現を使う
を使用していくつかの簡単なテストを行いorg.quartz.CronExpression
ました。
String exp = "0 0 0 1 1 ? 3000";
boolean valid = CronExpression.isValidExpression(exp);
System.out.println(valid);
if (valid) {
CronExpression cronExpression = new CronExpression(exp);
System.out.println(cronExpression.getNextValidTimeAfter(new Date()));
}
するとString exp = "# 0 0 0 1 1 ?";
、isValid
テストは戻りますfalse
。
上記のサンプルを使用すると、出力は次のようになります。
true
null
意味:
- 式は有効です。
- この式に一致する次の日付はありません。
ただし、スケジューラが cron トリガーを受け入れるには、後者が将来の日付と一致する必要があります。
数年試してみたところ、年が2300年を超えると、Quartzはもう気にならないように見えることがわかりました(ただし、Quartz 2のドキュメントで年の最大値への言及は見つかりませんでした)。これを行うためのよりクリーンな方法があるかもしれませんが、これは今のところ私のニーズを満たします。
最後に、私が提案する cron は0 0 0 1 1 ? 2200
.
クォーツ 1 バリアント
Quartz 1 では、2099 年が最後の有効な年であることに注意してください。したがって、 Maciej Matys の提案を使用するように cron 式を適合させることができます。59 59 23 31 12 ? 2099
代替手段: 過去の日付を使用する
Arnaud Denoyelleは、より洗練されたものを提案しました。上記の私のテストでは、正しい表現として検証されています。遠い未来の日付を選択する代わりに、遠い過去の日付を選択してください。
0 0 0 1 1 ? 1970
(Quartz のドキュメントによると、最初の有効な式)。
ただし、このソリューションは機能しません。
hippofluffは、Quartz が過去に式が二度と実行されないことを検出し、例外をスローすることを強調しました。
org.quartz.SchedulerException: Based on configured schedule, the given trigger will never fire.
これは長い間Quartz にあったようです。
教訓: テストはそのままでは絶対確実ではない
これは私のテストの弱点を浮き彫りにします: a をテストしたい場合は、 1を持たなければならCronExpression
ないことを覚えておいてください。それ以外の場合、渡すスケジューラーは、上記の例外で単純に拒否します。nextValidTime
テスト コードを次のように変更することをお勧めします。
String exp = "0 0 0 1 1 ? 3000";
boolean valid = CronExpression.isValidExpression(exp);
if (valid) {
CronExpression cronExpression = new CronExpression(exp);
valid = cronExpression.getNextValidTimeAfter(new Date()) != null;
}
System.out.println("Can I use <" + exp + ">? " + (valid ? "Go ahead!" : "This shall fail."));
では、考える必要はありません。出力を読むだけです。
1これは、Arnaud のソリューションをテストしたときに忘れてしまった部分であり、私をばかにして、私のテストが証明されていないことを証明しました。