Il est souvent nécessaire dans une applications d’avoir des Batchs qui tournent pour effectuer des traitements diverses et variés. Lorsque ces process ne nécessitent pas interaction avec un utilisateur ceux-ci peuvent être différés pour des raisons d’optimisation entre autre. Depuis Java 1.4 il est possible de planifier des tâches de manière simple, cependant la librairie Quartz permet de gérer ces process différés de manière plus fine, avec un déclenchement similaire à l’utilisation d’un cron sous unix. Ce billet relativement court présente une manière très simple d’utiliser ce mécanisme avec Seam.
Seam intègre un mécanisme basé sur Quartz, et utilisant l’annotation @Asynchronous pour faciliter ces traitements. Par exemple si jai besoin dun batch qui tourne toutes les 5 minutes voici comment je pourrais procéder.
Dans un composant on commence par écrire une méthode annotée @Asynchronous Ici FileBrowser est simplement un composant conservant l’état des données. FileBrowserService contient notre méthode asynchrone.
public class FileBrowserService {
//[...]
@Asynchronous
public void synchronise(@Expiration Date when, @IntervalCron String cron) {
logger.debug("Automatic Sync Processing");
if (FileBrowser.getInstance().isSynchronizationInProcess()) {
return;
}
try {
FileBrowser.getInstance().setSynchronizationInProcess(true);
FileBrowser.getInstance().setFileList(this.browseDirectory(PATH));
FileBrowser.getInstance().setFileOutputList(this.browseDirectory(OUTPUT));
} finally {
FileBrowser.getInstance().setSynchronizationInProcess(false);
}
}
//[...]
}
On remarque trois chose : - Il suffit d’annoter la méthode @Asynchronous pour que celle-ci le devienne. - @Expiration Date when, définit la date de départ du process. - @IntervalCron String cron, définit l’interval du cron.
Et pour le lancer on peut écrire un composant (FileBrowserInitializer dans mon cas), qui appellera la méthode lors de sa création.
fileBrowserService.synchronise(new Date(), "0 0/5 * * * ?");
Pour ce qui est du paramétrage du deuxième argument je vous renvoi à l’utilisation classique des Crons : Crontab
Et voilà, c’est très simple, mais très utile !
