TL; DR
In Quarz 1 können Sie diesen Cron verwenden: 59 59 23 31 12 ? 2099
(letztes gültiges Datum).
In Quartz 2 können Sie diesen Cron verwenden:0 0 0 1 1 ? 2200
Verwenden Sie einen Ausdruck weit in der Zukunft
Habe einige schnelle Tests mit gemacht 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()));
}
Wenn ich das tue String exp = "# 0 0 0 1 1 ?";
, isValid
kehrt der Test zurück false
.
Mit dem oben angegebenen Beispiel ist die Ausgabe wie folgt:
true
null
Bedeutung:
- der Ausdruck ist gültig;
- Es gibt kein bevorstehendes Datum, das diesem Ausdruck entspricht.
Damit der Scheduler einen Cron-Trigger akzeptieren kann, muss dieser jedoch mit einem zukünftigen Datum übereinstimmen.
Ich habe es mehrere Jahre lang versucht und herausgefunden, dass Quarz, sobald das Jahr über 2300 liegt, nicht mehr zu stören scheint (obwohl ich keine Erwähnung eines Maximalwerts für das Jahr gefunden habe in der Dokumentation von Quarz 2 ). Es könnte einen saubereren Weg geben, dies zu tun, aber dies wird meine Bedürfnisse vorerst befriedigen.
Am Ende ist also der Cron, den ich vorschlage 0 0 0 1 1 ? 2200
.
Variante Quarz 1
Beachten Sie, dass in Quarz 1 2099 das letzte gültige Jahr ist . Sie können daher Ihren Cron-Ausdruck anpassen, um den Vorschlag von Maciej Matys zu verwenden :59 59 23 31 12 ? 2099
Alternative: Verwenden eines Datums in der Vergangenheit
Arnaud Denoyelle schlug etwas Eleganteres vor, was mein Test oben als korrekten Ausdruck bestätigt: Anstatt ein Datum in ferner Zukunft zu wählen, wählen Sie es in einer fernen Vergangenheit:
0 0 0 1 1 ? 1970
(der erste gültige Ausdruck gemäß Quarzdokumentation).
Diese Lösung funktioniert jedoch nicht.
Hippofluff betonte, dass Quarz einen Ausdruck in der Vergangenheit erkennt , nie wieder ausgeführt wird und daher eine Ausnahme auslöst .
org.quartz.SchedulerException: Based on configured schedule, the given trigger will never fire.
Dies scheint schon lange in Quarz zu sein .
Lektionen gelernt: Der Test ist nicht so narrensicher wie er ist
Dies unterstreicht eine Schwäche meines Tests: Wenn Sie a testen möchten CronExpression
, denken SienextValidTime
daran, dass es eine 1 haben muss . Andernfalls lehnt der Scheduler, an den Sie es übergeben, es einfach mit der oben genannten Ausnahme ab.
Ich würde empfehlen, den Testcode wie folgt anzupassen:
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."));
Los geht's: Sie müssen nicht nachdenken, lesen Sie einfach die Ausgabe.
1 Dies ist der Teil, den ich vergessen habe, als ich Arnauds Lösung getestet habe, um mich zum Narren zu machen und zu beweisen, dass mein Test nicht für mich geeignet war.
#
Kommentarzeichen zu beginnen .