Planifiez vos batchs avec Jboss Seam et Quartz

Publié le par seekaftersomething.over-blog.com


La planification de traitements est une chose récurrente à tout projet et à chaque fois on se pose la même question : par quoi fais-je planifier ces traitements?

Et bien si vous utilisez JBoss Seam, pas besoin de vous prendre la tête ! Tout a déjà été pensé et même plutôt bien pensé.

JBoss Seam inclus un Scheduler et pas des plus mauvais puisqu'il s'agit de Quartz.

Avant de rentrer dans le détail, je vais vous expliquer de façon succincte le principe.

  • Seam permet de générer des événements (Events) avec un nom et/ou des paramètres, et de récupérer ces événements via un Observer.
  • Quartz permet de créer un job et de la planifier grâce à une expression Cron. A la date d'exécution, un événement sera généré qui permettra de lancer la méthode ayant l'Observer.

La gestion des événements de JBoss Seam:

Un événement est comme un signal lancé dans l'application. Cet événement (event) est défini par un nom, on peut également passer des paramètres à cet event. Certains composants Seam génèrent déjà des événements par exemple lors de l'identification (Identity).

Pour envoyer manuellement des events depuis votre code, il faut récupérer une instance de la classe Events soit via Events.instance() soit via une injection Seam avec@In private Events events.

Ensuite pour lancer un événement, il faut utiliser la méthode :
  void raiseEvent(String type, Object...parameters)

La premier paramètre est le nom de l'event et le deuxième correspond à un liste variable d'objet. On peut se servir de cette liste pour spécifier le nom de la personne qui a lancé l'event par exemple.

Après vous allez me dire c'est bien beau de lancer des événements, mais comment on les récupère?

Et bien grâce à l'annotation Observer.

 @Observer("JOB_NAME") public void function(Objects... parameters) { // code } 

Les paramètres de cette fonction sont les objets envoyés par la méthode raiseEvent. C'est plutôt sympa non?

Utilisation de Quartz dans Seam:

Pour planifier un batch (job), on a besoin de 2 classes qui vont nous permettre de tout faire:
- QuartzDispatcher qui permet de créer un job quartz
- QuartzTriggerHandle qui permet de gérer le trigger.

Exemple de création d'un Job avec Seam / Quartz  grâce à la méthode scheduleTimeEvent :

 quartzTriggerHandle = QuartzDispatcher.instance().scheduleTimedEvent("JOB_NAME", new CronSchedule(startDate, expressionCron, Objects...parameters) 

Ceci va permettre de générer un event avec sa liste de paramètres à chaque date prévu par le Cron.

Attention, la variable startDate est indépendante du Cron  et correspond à la date de prochaine exécution du Job.

Petite astuce, pour valider votre expression Cron, vous pouvez utiliser la méthode isValidExpression de la classe CronExpression.

Publié dans Java

Commenter cet article