TL;DR
Dans Quartz 1, vous pouvez utiliser ce cron : 59 59 23 31 12 ? 2099
(dernière date valable).
Dans Quartz 2, vous pouvez utiliser ce cron : 0 0 0 1 1 ? 2200
Utiliser une expression loin dans le futur
J'ai effectué quelques tests rapides en utilisant 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()));
}
Quand je le fais String exp = "# 0 0 0 1 1 ?";
le isValid
les résultats des tests false
.
Avec l'exemple donné ci-dessus, la sortie est la suivante :
true
null
C'est-à-dire :
- l'expression est valide ;
- il n'y a pas de date à venir qui corresponde à cette expression.
Pour que le planificateur accepte un déclencheur cron, cependant, le dernier doit correspondre à une date dans le futur.
J'ai essayé sur plusieurs années et je me suis rendu compte qu'une fois que l'année est supérieure à 2300, Quartz semble ne plus s'en préoccuper (bien que je n'aie pas trouvé de mention d'une valeur maximale pour l'année). dans la documentation de Quartz 2 ). Il existe peut-être une façon plus propre de procéder, mais cela répond à mes besoins pour l'instant.
Donc, au final, le cron que je propose est 0 0 0 1 1 ? 2200
.
Quartz 1 variante
Notez que, dans le Quartz 1, 2099 est la dernière année valide . Vous pouvez donc adapter votre expression cron pour utiliser Suggestion de Maciej Matys : 59 59 23 31 12 ? 2099
Alternative : Utiliser une date dans le passé
Arnaud Denoyelle a proposé quelque chose de plus élégant, que mon test ci-dessus valide comme une expression correcte : au lieu de choisir une date dans un futur lointain, choisissez-la dans un passé lointain :
0 0 0 1 1 ? 1970
(la première expression valide selon la documentation de Quartz).
Cette solution ne fonctionne cependant pas.
hippofluff a mis en évidence que Quartz détectera une expression dans le passé qui ne sera plus jamais exécutée et lancera donc une exception.
org.quartz.SchedulerException: Based on configured schedule, the given trigger will never fire.
Cela semble avoir été dans Quartz pendant un long moment .
Leçons apprises : le test n'est pas infaillible tel quel
Cela met en évidence une faiblesse de mon test : dans le cas où vous voulez tester un CronExpression
Souvenez-vous. il doit avoir un nextValidTime
1 . Sinon, le planificateur auquel vous le transmettrez le rejettera simplement avec l'exception mentionnée ci-dessus.
Je conseillerais d'adapter le code de test comme suit :
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."));
Et voilà : pas besoin de réfléchir, il suffit de lire le résultat.
<sup>1 </sup>C'est la partie que j'ai oubliée lorsque j'ai testé la solution d'Arnaud en me ridiculisant et en prouvant que mon test n'était pas à ma hauteur.