mercredi 18 février 2009

Paramétrer CronTrigger de Quartz : un jeu d’enfant pour un connaisseur du Cron d’UNIX

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
void imprimeCronExpression(String expression) throws Exception{

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 :

Belhaj Ali Slimen a dit…

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

Architecte SOA & Professionnel Open Source Headline Animator

 
Khaled BEN DRISS
Cloud Computing, SOA et Web 2.0 : Des sujets techniques sur SOA et l'Open Source : de Java & .Net, PHP5, Symfony, à SaaS / PaaS en passant par Azure, google appengine, le BPM, la Modélisation et d'autres sujets du coté du serveur et cloud computing.