Les slides de cette très bonne introduction sont disponibles ici.
Pour ma part, voici ce que je retiens de cette présentation :
Qu’entend t-on lorsque l’on parle de batch ?
Il s’agit d’un enchaînement automatique de commandes ne nécessitant pas l’intervention d’un opérateur. Ces traitements peuvent réaliser des opérations métier sur de gros volumes de données.
Un exemple courant de batch est l’import d’un référentiel de données XML dans une base de données relationnelle.
L’accent a été porté par les intervenants sur le fait qu’il ne faut pas confondre batch avec scheduler. En effet, un scheduler (Cron, Quartz) n’est qu’un outil permettant de lancer un batch.
Les frameworks disponibles pour la réalisation de batchs ?
Par contre, lorsque l’on s’attaque à la réalisation d’un batch, on peut parfois se sentir démuni de tout outil, pourtant Spring Batch est là.
Bien entendu, il ne répond pas forcément à tous les cas d’utilisation mais en faire un petit tour d’horizon peut aider à prendre une décision la prochaine fois que la réalisation d’un batch s’impose.
A quoi ressemble un batch classique ?
Ils consistent souvent en un bloc monolithique de code, ils sont de ce fait difficilement maintenables.
La réutilisation de code d’un batch à l’autre n’est pas une tâche aisée et l’on est souvent amené à réinventer la roue pour réaliser des fonctionnalités très semblables (lecture d’un fichier XML, écriture dans une base de données, ...).
Il est nécessaire de connaître la volumétrie avant le développement, de manière à découper en lots appropriés les traitements.
Il est difficile de faire évoluer un batch qui était initialement prévu pour traiter un fichier de 10ko pour qu’il traite à l’avenir des fichiers de 100mo.
La gestion des transactions et des rejets est laissée à la charge du développeur.
Quelle est la réponse de Spring Batch ?
Il instaure un vocabulaire commun d’un batch à l’autre.
Il permet de répartir les traitements par lots et cela sur de gros volumes sans que les développements spécifiques ne soient impactés.
Ce framework intègre la gestion des transactions et un processus de commit régulier.
Bien entendu, l’intégration de Spring dans le batch est native. Au-delà de ces différents aspects de base, Spring Batch propose des fonctionnalités “avancées” permettant de répondre à des besoins plus spécifiques parmi lesquels :
- Le partitionnement
- Le parallélisme
- La reprise sur erreur
Comment s’organise un batch Spring Batch ?
Une étape met en oeuvre un ItemReader, un ItemWriter et peut également faire appel à un ItemProcessor.
Ces trois éléments sont des interfaces, voici la vocation de chacune :
Le traitement des données dans une Step s’effectue par lots (Chunk) successifs. La gestion d’un lot s’effectue de la manière suivante : n items d’entrée sont lus successivement puis transformés en vue d’être écrits.
La taille des lots est définie par le commit-interval. Lorsque le nombre d’items lus atteint cette limite, les items sont écrits par l’ItemWritter et la transaction est “commitée”.

Dans la documentation Spring Batch, le schéma ci-dessus est représenté de la manière suivante en code :
List items = new Arraylist();
for(int i = 0; i < commitInterval; i++){
items.add(itemReader.read());
}
itemWriter.write(items);
Il est possible d’éxécuter un batch en ligne de commande et de lui passer ses paramètres en utilisant le CommandLineJobRunner.

Les tests :
Du fait du cadre proposé par Spring Batch, l’écriture de tests unitaires est relativement aisée. Il est ainsi possible de tester unitairement les différents composants de votre réalisation intervenant dans l'exécution du batch (itemReaders, itemProcessors, ...).
De même, il est tout à fait possible d’écrire des tests d’intégration.
Retour d’expérience des intervenants :
Olivier Bazoud nous a présenté son constat vis à vis de l’utilisation de Spring Batch en entreprise.Il a mis l’accent sur le fait qu’il y avait moins de code à écrire, cet élément couplé au fait que les batch réalisés avec Spring Batch sont fortement testables, les erreurs possibles sont moindres.
Un point important est le fait qu’il est plus facile à deux développeurs de batchs de communiquer grâce au vocabulaire porté par Spring Batch.
La délégation de la gestion des transactions à Spring Batch est un point appréciable.
Sur le plan concret les chiffres suivants ont été évoqués :
- 15% à 50% de gain sur le temps de développement
- 15% à 50% de gain sur le temps d'exécution des batchs
Conclusion :
De nombreuses fonctionnalités avancées sont intégrées à l’outil et peuvent être mises en place à moindre coût.
Bien que la productivité soit meilleure à termes, il faut toutefois être conscient que le coût initial est important.
Les intervenants ont évoqué la possibilité d’intervenir une prochaine fois sur les notions plus avancées de Spring Batch telles que le partitionning, le parallélisme, le remoting, la reprise sur erreur ou encore Spring Batch Admin
Liens :
La présentation
Le code qui a servi de support à la présentation
Documentation officielle Spring Batch
Le Spring User Group
La prochaine session du Spring User Group est prévue le 10 juin sur les styles d’injections de dépendances de Spring. Cette session sera animée par Chris Beams (ingénieur Spring Source).
