Quartz utilise des "expressions cron" pour calculer le moment exact du lancement d'un JOB (par exemple le 3 de chaque mois à 21H10, lancer le batch de remboursement).
Cron expressions est très puissants, mais peut être assez déroutant, pour les débutants.
En fait, il suffit de connaitre le choix fait par Quartz, pour que tout devienne simple.
La classe CronTrigger deQuartz a été aligné sur le format des expressions CRON d'UNIX, qui est un outil puissant et éprouvé de planification soius UNIX.
C'est la classe org.quartz.CronExpression qui implémente le détail (le détail se trouve dans la documentation JavaDoc de CronExpression)
Ce tutoriel a pour but de prendre une partie de mystère de la création d'un cron expression
Avant de commencer, je présente ici quelques lignes de code java qui permettent de tester une expresion CRON avant de la lancer en production
public CronExpression cronExpression= null; cronExpression = new CronExpression(expression); Date fire1 = cronExpression.getNextValidTimeAfter(new Date()); System.out.println(d1); } |
Si on fixe l'expression = "0 15 21 3 * ?"
Le résultat, de l'appel de la méthode imprimeCronExpression ("0 15 21 3 * ?")
Tue Mar 03 21:15:00 CET 2009 (le 03 du mois à 21:15:00) |
Une expression Cron est une chaine de caractères composée de 7 champs (dont les 6 premiers on obligatoires)
champ | Valeurs autorisés | Caractère spécial autorisé |
Secondes | 0-59 | , - * / |
Minutes | 0-59 | , - * / |
Heures | 0-23 | , - * / |
Jour du mois | 1-31 | , - * ? / L W |
Mois | 1-12 ou JAN-DEC | , - * / |
Jour de la semaine | 1-7 ou SUN-SAT | , - * ? / L # |
année | vide, 1970-2099 | , - * / |
La liste de Caractères spéciaux autorisés
* | ( "toutes les valeurs») - utilisée pour sélectionner toutes les valeurs dans un champ. Par exemple, "*" dans le domaine minutes "chaque minute". |
? | ( "pas de valeur") - utile si vous avez besoin de préciser quelque chose dans l'un des deux domaines (Jour du mois ou Jour de la semaine) dans lesquels les caractères sont autorisés, mais pas l'autre. Par exemple, si je veux déclencher un job le 3èmejour du mois, indépendamment du jour la semaine "0 15 21 8 * ?".
Mettre l'expression "0 15 21 8 * *", déclemnche une Exception java.lang.UnsupportedOperationException: Support for specifying both a day-of-week AND a day-of-month parameter is not implemented. |
- | utilisé pour indiquer une fourchette. Par exemple, "10-12" à l'heure domaine signifie "l'heure 10, 11 et 12". |
, | utilisés pour spécifier des valeurs. Par exemple, « MON,WED,FRI" signifie, "le jour lundi,mercredi et vendredi». |
/ | utilisé pour spécifier les incréments. Par exemple -- "0 / 15" dans le champ des secondes signifie «la seconde 0, 15, 30 et 45" --"5 / 15" dans le champ des secondes signifie «la seconde 5, 20, 35 et 50". Vous pouvez aussi spécifier "/" après le caractère''-''dans ce cas est équivalent à avoir «0» avant le «/»." 2 / 3 " dans le chanmp Jour du mois, "lancer le job tous les 3 jours à partir du deuxième jour du mois". |
L | ( "dernier") - la valeur "L" dans Jour de la semaine, il signifie simplement "7" ou "SAT". - la valeur "L" dans « Jour du mois », signifie "le dernier jour du mois", donc 31 jours de Janvier, Février pour 28 jours sur les années non bissextiles. Mais si elle est utilisée après une autre valeur, il signifie "le xxx dernier jour du mois" - par exemple "6L" signifie "le dernier vendredi du mois". |
W | ( «semaine») - utilisée pour spécifier le jour de la semaine (lundi-vendredi) le plus proche de la journée. Par exemple, "15W": "le plus proche jour de la semaine du 15 du mois". Ainsi, si le 15 est un samedi, le job sera lancé, le vendredi 14, mais si le 15 est un dimanche, le le job sera lancé le lundi 16. Si le 15 est un mardi, le job sera lancé, le mardi 15. Cas exceptionnel : "1W" , si le 1er est un samedi, le job sera lancé le lundi 3 du mois, car il doit être lancé durant le mois. Autre cas « LW » : le dernier jour de la semaine du mois |
# | Signifie le Nième XXX jour du mois. "6#3" "le 3iemme vendredi du mois" (jour 6 = Friday). "2#1" = le premier Lundi du mois "4#5" = le 5iemme Mercredi du mois (si le mois ne comporte pas 5 mercredi, le job ne sera pas lancé |
Le reste c'est un jeu d'enfant (javadoc de CronExpression quartz sur le sujet)
1 commentaires :
Si le temps d'excution depasse l'interval entre deux excutions successive, y'a il une mecanisme qui gère ce cas?
Merci
Enregistrer un commentaire