Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.
Workshop Spring - Session 4 
Retour d’expérience 
Mise en oeuvre de Spring Batch 
Diffusé en janvier 2012 
Réactualisé en ...
Sommaire 
Introduction 3 
Présentation de l’étude de cas 4 
Objectifs 7 
Mise en oeuvre 8 
Pour aller plus loin 23 
Conclu...
Introduction 
• Qu’est-ce qu’un Batch ? 
• Suite de traitements sur un ensemble de données 
• sans intervention humaine 
•...
Présentation de l’étude de cas 
4 
Périmètre fonctionnel 
• Commandes réalisées depuis une application Web 
et stockées en...
Présentation de l’étude de cas 
• Projet métier 
• Retarder l’exécution de 2 batchs quotidiens 
• Export de données au Mai...
Présentation de l’étude de cas 
1. Récupère les identifiants des commandes à exporter 
2. Charge les commandes à partir de...
Objectifs 
• Migration technique 
• Mêmes données en entrée 
• Mêmes fichiers en sortie 
• Evolutions techniques 
• Tests ...
Mise en oeuvre 
8 
Décomposition des batchs en une seule étape 
Base 
MySql 
avec 
Commandes 
Alerte par mail 
Erreur 
Lec...
Spring Batch 
9 
Vocable 
Job 
Step 
Chunk Tasklet 
ItemReader ItemProcessor ItemWriter 
s 
Base 
G@el
Spring Batch 
10 
Diagramme de séquence de traitement d’un chunk 
TaskletStep ItemReader ItemProcessor ItemWriter 
read 
i...
Mise en oeuvre 
11 
Configuration d’un Job et d’un Step 
<!-- Job Spring Batch chargé d'exécuter le batch JM076--> 
<batch...
Mise en oeuvre 
12 
Reader Hibernate 
Initialement décomposé en un bean parent générique et un bean 
spécifique au batch J...
Spring Batch 
13 
Quelques implémentations de Reader disponibles 
public interface ItemReader<T> { 
T read() throws Except...
Mise en oeuvre 
14 
Déclaration et implémentation d’un Item Processor 
<!-- Traite les commandes fin d'émettre les facture...
Mise en oeuvre 
15 
Configuration des writers (1/2) 
<!-- Writer composite Spring batch chargé de générer 2 fichiers 
pour...
Spring Batch 
16 
Quelques implémentations de writers disponibles 
public interface ListItemWriter<T> { 
void write(List<?...
Mise en oeuvre 
17 
Configuration des writers (2/2) 
<!-- Writer Spring batch chargé d'écrire le fichier des factures --> ...
Mise en oeuvre 
• Besoin 
• Une seule et unique transaction pour tout le batch 
• Les erreurs fonctionnelles ne doivent pa...
Mise en oeuvre 
19 
Gestion des transactions (2/2) 
<batch:tasklet transaction-manager="transactionManager" …> 
<batch:chu...
Mise en oeuvre 
• Besoin 
• Erreur de traitement d’une commande non bloquante 
• Enregistrée dans les pistes d’audit 
• Êt...
21 
Mise en oeuvre 
<batch:tasklet …> 
<batch:chunk … skip-limit="2147483647" …> 
… 
<batch:skippable-exception-classes> 
...
Mise en oeuvre 
• Exécution possible en ligne de commande ou par 
programmation 
• Ordonnanceur : Quartz, $U, CRON, planif...
Pour aller plus loin 
• Console d’administration et de suivi 
• Spring batch Admin 
• Reprise sur erreur 
• Réexécution d’...
Conclusion 
• Code technique supprimé 
• Réutilisabilité du code métier 
• Création des enregistrements CICS à partir des ...
Conclusion 
25 
Spring Batch en 3 mots 
Robuste 
• Fiable 
• Gestion des 
erreurs 
• Reprise 
• Tests unitaires 
• Perform...
Prochain SlideShare
Chargement dans…5
×

Workshop Spring - Session 4 - Spring Batch

8 932 vues

Publié le

Publié dans : Technologie
  • Soyez le premier à commenter

Workshop Spring - Session 4 - Spring Batch

  1. 1. Workshop Spring - Session 4 Retour d’expérience Mise en oeuvre de Spring Batch Diffusé en janvier 2012 Réactualisé en décembre 2014
  2. 2. Sommaire Introduction 3 Présentation de l’étude de cas 4 Objectifs 7 Mise en oeuvre 8 Pour aller plus loin 23 Conclusion 24 2 Retour d’Expérience sur la mise en oeuvre de Spring Batch
  3. 3. Introduction • Qu’est-ce qu’un Batch ? • Suite de traitements sur un ensemble de données • sans intervention humaine • Java et les batchs • Spring Batch • Standardisation JSR-352 Batch Applications dans JEE 7 – Implémentation de référence : https://java.net/projects/jbatch/ • Aucune alternative aussi aboutie • Objectifs • Aperçu concret de sa Mise en oeuvre • Intégrer les fondamentaux • Avoir une vue d’ensemble de Ses fonctionnalités • L’utiliser demain 3 Workshop sur les batchs en java
  4. 4. Présentation de l’étude de cas 4 Périmètre fonctionnel • Commandes réalisées depuis une application Web et stockées en base de données • Tous les soirs, un traitement batch émet un fichiers client et un fichier de facturation vers un Back Office Mainframe • Les commandes traitées sont marquées comme tel
  5. 5. Présentation de l’étude de cas • Projet métier • Retarder l’exécution de 2 batchs quotidiens • Export de données au Mainframe réalisé à chaud • Batchs iso-fonctionnels • Recette complète par la MOA • Opportunités • Montée de version de framework : Spring et Hibernate • Migration d’un framework de batch maison à Spring Batch 2.1 • Déploiement automatisé des batchs • Fiabiliser l’exécution des batchs Gestion des erreurs et des codes retours • Améliorer la gestion des logs • Bénéficier de reporting 5 Origine du projet de migration
  6. 6. Présentation de l’étude de cas 1. Récupère les identifiants des commandes à exporter 2. Charge les commandes à partir de leurs identifiants 3. Itère sur la liste des commandes 1. Génère les factures et identifie les clients 2. Construit les enregistrements CICS des factures et des clients 3. Incrémente les compteurs 4. Construit les enregistrements header et footer 5. Ecrit les enregistrements dans 2 fichiers temporaires 6. Met à jour en base de données un flag d’émission 7. Renomme les fichiers temporaires afin qu’ils soient pris en compte par le système de transfert de fichier 6 Batchs existants décomposés en 7 étapes
  7. 7. Objectifs • Migration technique • Mêmes données en entrée • Mêmes fichiers en sortie • Evolutions techniques • Tests de non régressions – Tests de bout en bout basés sur : • Un échantillonnage de données de production • Des fichiers générés à partir du batch existant • Des outils : H2, Maven et JUnit • Tests selenium • Saisie et émission de commandes • Exécutés automatiquement avant, pendant et après le batch 7 Des batchs iso-fonctionnels
  8. 8. Mise en oeuvre 8 Décomposition des batchs en une seule étape Base MySql avec Commandes Alerte par mail Erreur Lecture Ecriture Fichier de facturation Fichier des clients Traitement Construction Enregistrements CICS Une étape décomposée en 3 phases
  9. 9. Spring Batch 9 Vocable Job Step Chunk Tasklet ItemReader ItemProcessor ItemWriter s Base G@el
  10. 10. Spring Batch 10 Diagramme de séquence de traitement d’un chunk TaskletStep ItemReader ItemProcessor ItemWriter read item transform(items) transformedItems write(transformedItems) Chaque chunk s’exécute dans sa propre transaction Les items sont lus un à un ou en bloc La phase de traitement est optionnelle Le lot de données à traiter peut être morcelé en chunk Point de sauvegarde avant le commit
  11. 11. Mise en oeuvre 11 Configuration d’un Job et d’un Step <!-- Job Spring Batch chargé d'exécuter le batch JM076--> <batch:job id="batchJM076Job" restartable="false"> <batch:step id="processCarOrderStep" parent="processOrderStep" /> </batch:job> Permet de mutualiser le step entre 2 batchs <!– Etape chargée d'émettre des commandes--> <batch:step id="processOrderStep" abstract="true"> <batch:tasklet transaction-manager="transactionManager"> <batch:chunk reader="orderReader" processor="orderProcessor" writer="billingAndCustomerWriter" … /> </batch:tasklet> … </batch:step> Référence 3 beans Spring Batch transactionnel
  12. 12. Mise en oeuvre 12 Reader Hibernate Initialement décomposé en un bean parent générique et un bean spécifique au batch JM076 <!-- Reader Spring Batch chargé de récupérer les commandes à traiter depuis la base de données via Hibernate --> <bean id="orderReader" class="org.sf.batch.item.database.HibernateCursorItemReader" p:sessionFactory-ref="sessionFactory" p:useStatelessSession="false"> <property name="queryString" value="FROM Order order WHERE order.sentItemFlag is null ORDER BY id" /> </bean> Session Hibernate nécessaire pour le Lazy-loading Requête HQL de sélection des commandes à émettre
  13. 13. Spring Batch 13 Quelques implémentations de Reader disponibles public interface ItemReader<T> { T read() throws Exception, UnexpectedInputException, ParseException; } Classes Propriétés StoredProcedureItemReader Nom de la procédure stockée, paramètres, row mapper JdbcPagingItemReader Taille d’une page, fournisseur de requêtes SQL pagninées, paramètres FlatFileItemReader Encodage, ressource à lire, lignes d’en-tête, line mapper, séparateur StaxEventItemReader Ressource XML à lire, élément racine, unmarshaller JmsItemReader Jms template, file JMS à lire
  14. 14. Mise en oeuvre 14 Déclaration et implémentation d’un Item Processor <!-- Traite les commandes fin d'émettre les factures --> <bean id="orderProcessor" class="com.javaetmoi.batch.jm076.CarOrderProcessor" scope="step" p:billingCounter-ref="billingCounter" p:customerCounter-ref=« customerCounter" /> public class CarOrderProcessor implements ItemProcessor<Order, ProcessResultHolder> { public ProcessResultHolder process(Order order) throws BatchException { // … Création des factures et identification des clients return processResultHolder; } … }
  15. 15. Mise en oeuvre 15 Configuration des writers (1/2) <!-- Writer composite Spring batch chargé de générer 2 fichiers pour le back office et de mettre à jour la base MySql--> <bean id="billingAndCustomerWriter" class="org.sf.batch.item.support.CompositeItemWriter"> <property name="delegates"> <list> <!-- Fichier des factures --> <ref bean=« billingWriter" /> <!-- Fichier des clients --> <ref bean="customerWriter" /> <!– Mis à jour indicateur de transmission dans la table des commandes --> <ref bean="orderFlagWriter" /> </list> </property> </bean> Writers délégués appelés séquentiellement dans l’ordre déclaré
  16. 16. Spring Batch 16 Quelques implémentations de writers disponibles public interface ListItemWriter<T> { void write(List<? extends T> items) throws Exception; } Classes Propriétés HibernateItemWriter Template Hibernate JdbcBatchItemWriter Requête SQL, callback method chargé de setter les paramètres FlatFileItemWriter Encodage, fichier plat, séparateur de ligne, callbacks d’en-ête et de fin de fichier StaxEventItemWriter Fichier XML, élément racine, marshaller, callbacks d’en-ête et de fin de fichier SimpleMailMessageItemWriter Implémentation de MailSenders
  17. 17. Mise en oeuvre 17 Configuration des writers (2/2) <!-- Writer Spring batch chargé d'écrire le fichier des factures --> <bean id="billingWriter" class="com.javaetmoi.core.batch.writer.ExtendedFlatFileItemWriter" p:lineSeparator="" p:encoding="ISO-8859-1" p:shouldDeleteIfError="true" /> <property name="lineAggregator"> <bean class="com.javaetmoi…common.item.BillingLineAggregator"/> </property> <property name="resource" value="file:${batch.data.out.path} /billing-jm076.dat"/> <property name="footerCallback" ref="billingFooterCallback" /> </bean> <!-- Met à jour le flag des factures envoyées au back office --> <bean id="billingFlagWriter" class="com.javaetmoi…common.item.GenericFlagWriter" p:processOrderToExport-ref="processOrderToExport" /> <bean id=" processOrderToExport " class="fr…batch.commun.services.ProcessOrdertoExport" p:orderDao-ref="orderDao" />
  18. 18. Mise en oeuvre • Besoin • Une seule et unique transaction pour tout le batch • Les erreurs fonctionnelles ne doivent pas faire échouer le batch • Fichiers générés : tout ou rien • Comportement proposé par Spring Batch • Une transaction par chunk • Configuration des exceptions n’annulant pas la transaction • Les writers sur filesystem peuvent participer au contexte transactionnel • Solutions • Intervalle de commit réglé à l’infini pour avoir un unique chunk • Les exceptions de type BatchException ne provoquent pas de rollback • Les writers des factues et des clients sont enregistrés au Stream • Restauration en mémoire des compteurs assurée par un listener 18 Gestion des transactions (1/2)
  19. 19. Mise en oeuvre 19 Gestion des transactions (2/2) <batch:tasklet transaction-manager="transactionManager" …> <batch:chunk … commit-interval="2147483647" …> <batch:streams> <batch:stream ref="billingWriter" /> <batch:stream ref="customerWriter" /> </batch:streams> … </batch:chunk> <batch:no-rollback-exception-classes> <batch:include class="com…common.exception.BatchException" /> </batch:no-rollback-exception-classes> … <batch:listeners> <batch:listener ref="orderProcessListener" /> … </batch:listeners> </batch:tasklet>
  20. 20. Mise en oeuvre • Besoin • Erreur de traitement d’une commande non bloquante • Enregistrée dans les pistes d’audit • Être alerté par mail • Solutions • Les erreurs fonctionnelles signalées par des exceptions spécifiques ne doivent pas faire échouer le traitement – Non vérifiées, les BatchException sont levées lors de la génération des enregistrements – Paramétrable dans le chunk : skip-limit et skippable-exception-classes • Traces générées lorsqu’une exception est levée – Méthode onProcessError() de l’interface ItemProcessListener • Envoi de mail sur génération d’une trace de niveau >= à warning – Implémentation avec Logback : SMTPAppender, OnEventEvaluator, HTMLLayout 20 Gestion des erreurs (1/2)
  21. 21. 21 Mise en oeuvre <batch:tasklet …> <batch:chunk … skip-limit="2147483647" …> … <batch:skippable-exception-classes> <batch:include class="com…common.exception.BatchException" /> </batch:skippable-exception-classes> </batch:chunk> … </batch:tasklet> public void onProcessError(Order order, Exception ex) { LOGGER.error("Une erreur est survenue lors du traitement de la commande n°{}: {}", order.getNumber(), ex.getMessage()); } Gestion des erreurs (2/2)
  22. 22. Mise en oeuvre • Exécution possible en ligne de commande ou par programmation • Ordonnanceur : Quartz, $U, CRON, planificateur de tâches Windows … • Tests Junit et TestNG • JMX, Interface graphique, ServIces web … • Contexte projet : • Ordonnanceur Dollar Universe • Packagés dans un JAR – Extrait du MANIFEST.MF de myapp-batch-2.0.1.jar : – Main-Class: org.springframework.batch.core.launch.support.CommandLineJobRunner Class-Path: ./ojdbc-10.2.0.3-jdk14.jar ./spring-batch-core-3.0.2.RELEASE.jar … • En Ligne de commande – java -jar myapp-batch-2.0.1.jar com/javaetmoi/myapp/batch/applicationContext-batch-jm076.xml batchJM076Job 22 Exécution du batch
  23. 23. Pour aller plus loin • Console d’administration et de suivi • Spring batch Admin • Reprise sur erreur • Réexécution d’une instance de job • Persistance du contexte • Exécution dynamique • Enchaînement conditionnels d’étapes • Paramètres d’entrée évalués dynamiquement • Scalabilité et Parallélisme • Exécution de chunk et de step en parallèle • Sur la même machine ou de manière distribuée • Partionnement des données 23 Fonctionnalités non présentées
  24. 24. Conclusion • Code technique supprimé • Réutilisabilité du code métier • Création des enregistrements CICS à partir des commandes • Testabilité • Tests unitaires existants conservés • Tests de bout en bout ajoutés • Design Amélioré • Découpage mieux structuré • Peut-être encore meilleur si développé from scrath • Désenttement de l’ancien framework de batchs maison • Buggué au niveau du code retour en cas d’erreur • Exemple d’utilisation réutilisé pour 2 autres batchs • Job Repository persistant non exploité • Effort nécessaire pour monter en compétences • La connaissance du framework Spring est un pré-requis 24 Retours sur la migration vers Spring Batch
  25. 25. Conclusion 25 Spring Batch en 3 mots Robuste • Fiable • Gestion des erreurs • Reprise • Tests unitaires • Performant • Standardisé Productif • Cadre de développement • Maintenabilité • Code technique fourni Extensible • Ouvert • Spring Batch Admin • Spring Intégration

×