Planifiez facilement vos batchs avec Quartz et JBoss Seam

Publié le par stoi

Dans cet article je vais vous parler de la feature la plus cool de Seam selon moi : l'intégration avec Quartz et la gestion des événements.

La gestion des événements dans Seam

Il existe un système d'événements, comme des signaux, en seam, qui s'utilise de manière simplissime. Je ne vous en donnerais qu'un aperçu, je ne vais pas réécrire toute la documentation, mais vous allez voir comme, avec très peu, on peut faire beaucoup.

Un événement (event), dans ce contexte, c'est une String, son nom, et un nombre variable d'objets.
Un certain nombre de composants built-in de Seam lancent eux mêmes des events, comme, par exemple, lorsqu'on se log avec succès Identity lancera un event EVENT_LOGIN_SUCCESSFUL.

Pour envoyer un event manuellement depuis le code, il y a la classe Events, qu'on peut récupérer de deux façons :
- A l'ancienne avec Events.instance()
- Ou à la Seam avec @In private Events events

Pour lancer un event on pourra utiliser cette méthode, qui prends donc en premier paramètre le nom de l'event, et ensuite une liste variable d'objets :
     void raiseEvent(String type, Object... parameters)

Là où ça devient intérressant, c'est la manière d'attraper cet event :
 @Observer("NOM_DU_JOB") public void fonction(Objects... parametres) { // code } 

Les paramètres de la fonction sont les objets que nous avons envoyé dans le raiseEvent ! Facile non ?

L'intégration de Quartz et Seam

Quartz, c'est un peu LE scheduler en Java. Ça tourne bien, c'est facilement utilisable, et ils ont pensés à tout. En plus, ça permet d'utiliser les expressions Cron.

Dans Seam, il existe un couple de classes qui font le lien presque magiquement entre les deux APIs :
- QuartzDispatcher qui permet de créer un job quartz
- Et QuartzTriggerHandle qui est, comme son nom l'indique, une poignée sur le trigger.

Exemple de création d'un job Cron avec Seam/Quartz, qui lancera l'Event jobname tous les cron avec les paramètres
 quartzTriggerHandle = QuartzDispatcher.instance(). scheduleTimedEvent("jobname", new CronSchedule(startDate, expressionCron), Objects... parametres); 
Petite feinte : le start date, contrairement à ce que je pensais naïvement au début, n'est pas la date à partir de laquelle Quartz calcule la prochaine exécution (avec le cron) mais effectivement la prochaine date d'exécution, indépendamment du cron !

L'architecture que j'ai mis en place pour la gestion de mes batchs

- Une classe de scope Application qui possède une liste de tous les triggerHandle, qui ne sont pas accessible de l'extérieur :
         Des méthodes pour démarrer, mettre en pause ou annuler un job avec des contrôles
         Deux @Observer qui sont invoqués en cas de succès ou d'erreur (pour maj statut)

- Pour chaque batch, une facade Stateless avec l'@Observer qui log puis appelle les services renvoie un Event succes ou erreur

- Une méthode, au niveau du tier web pour relancer manuellement le batch avec la méthode
     Events.instance().raiseAsynchronousEvent(String type, Object... parameters)

Je vous ferais bien un schéma, mais j'ai pas le matériel ni la motivation pour vous le faire. D'autant plus que c'est pas hautement intellectuel, vous comprendrez sans petits dessins.


Maintenant que vous avez tout lu (j'en suis sur), avouez que c'est cool, non ? Et ce n'est qu'une petite partie de la gestion des events en seam ! Pour aller plus loin, je vous conseille de lire la doc, vous aurez des surprises..


tags : JAVA EE, Seam

Publié dans Java

Pour être informé des derniers articles, inscrivez vous :

Commenter cet article