http://chtijug.org/session-spring-batch-avec-ekino-le-29-novembre/
Nous avons le plaisir de vous annoncer que la prochaine session du Ch’ti JUG est prévue le 29 novembre 2011. Elle aura lieu à l’IUT A de Lille 1, boulevard Paul Langevin, à Villeneuve d’Ascq. Plan d’accès
Le thème de cette session est Spring Batch : un framework pour implémenter des traitements de masse en Java.
Cette présentation sera animée par Olivier Bazoud / @obazoud et Julien Jakubowski / @jak78.
Cette session est rendue possible grâce à Ekino / @3k1no.
3. Ekino / @3k1n0
• Conception, développement et
maintenance de dispositifs digitaux
• 150 personnes
– 50% de développeurs, 0% de régie
• Digital
– Mobile + HTML + RIA
– JAVA + PHP + .NET
• 6 pôles de compétences, 25 clients, 50
projets/an = 1 équipe
14. Intervenants
Olivier Bazoud @obazoud, Ekino @3k1n0
ISEN (Toulon)
Architecte technique
Java EE / Spring, Spring Batch, NoSQL, Node.js
Co-auteur de « Spring Batch in Action »
Spring User Group France
Julien Jakubowski, @jak78, OCTO Technology
ISEN (le vrai, de Lille)
Architecte technique
Spécialisé Java EE / Spring
Ch'ti JUG, Agile Tour Lille
15. De quoi va-t-on parler ce soir ?
• On va parler de batchs en Java
• … et aussi de bière
http://www.flickr.com/photos/fromeyetopixel/2559391584/
16. Nos objectifs
En sortant de la salle, vous :
Savez identifier certains problèmes récurrents
avec les batchs écrits en Java
Savez si Spring Batch est utile pour vous (ou
pas)
Avez intégré les notions principales
… et quelques notions avancées
Pouvez faire un batch « Spring Batch » demain
17. Ce qui vous attend
• Batch : de quoi parle-t-on ?
• Pourquoi Spring Batch ?
• Faisons ensemble un batch...
– Introduction progressive des notions de Spring Batch
• Retours d'expérience
• Forces et faiblesses
• Notions avancées - vote
• Questions / Réponses
18. Batch : de quoi parle-t-on ?
Batch processing = répétition de traitements sur
un ensemble de données…
19. Batch : de quoi parle-t-on ?
… potentiellement grands volumes…
http://www.flickr.com/photos/claudiasofia99/2878579560/
20. Batch : de quoi parle-t-on ?
… sans intervention d’un utilisateur humain – pas
d’interface homme-machine
21. Batch : de quoi parle-t-on ?
Exemples:
• Import flat / XML dans une base de données
• Mise à jour de données de référentiel
• Intégration de flux financiers dans un SI
• …
22. Batch : de quoi parle-t-on ?
Un batch n’est pas un scheduler
• Cron, inotify, Quartz, $U…
• Mais un scheduler peut le lancer
23. Beer Batch
• Caractéristiques :
– Lire le fichier XML de recettes, au format BeerXML
– Ecrire les recettes en base de données
– Filtrer certaines recettes et créer un fichier de rejets
29. Et quand j’écris un batch ?
Je suis… à poil ?
http://www.flickr.com/photos/crystaljingsr/3914729343/sizes/o/in/set-72157622354789320/
30. Et quand j’écris un batch ?
Spring Batch offre pourtant une solution pour vous guider
lors de l’écriture de vos batchs en Java
31. Spring Batch propose…
• Un cadre
• Un vocabulaire (domain language)
• Traitement par lots (grands volumes de
données)
• Gestion des transactions
• Flow, reprise sur erreur
• Spring dans ses batchs
Parallélisme Spring Batch Admin
Partitionnement
33. BeerBatch V2
• Ecrire la date de début du batch
• Lire le fichier XML de recettes, au format BeerXML
• Filtrer certaines recettes et créer un fichier de rejets
• Ecrire en base de données
Spring Batch
36. Tasklet
• Besoin
– Effectuer une tâche unitaire
• Exemples
– Supprimer un répertoire et son contenu
– Unzip d’un fichier
– Appel d’une procédure stockée
– Appel d’un web service
42. ItemProcessor
• Besoin
– Transforme, valide et / ou filtre une recette
• ItemProcessor
– Transforme un item en un autre
– Filtrer ou rejeter un item
– Emplacement pour les « règles métier »
49. Chunk
• Besoin
– Lire, transformer et écrire
• Chunk
– Lire et transformer les données successivement
– Ecrire le lot de données
– Le commit-interval définit la taille du lot (différent de la taille du
fichier)
– Gestion de la transaction : Commit/Rollback
69. Forces et faiblesses
✔Fiabilité et bons patterns
✔Tests unitaires et d'intégration, TDD
✔Batchs complexes mieux maintenables
✔Bénéficie de fonctions avancées à moindre coût
✔...the Spring way, intégration à Spring
✔Productivité, à terme...
✗… après avoir payé le ticket d'entrée
70. Retour d’expérience
Ekino
• Framework de batch
– Moins de code produit, moins d'erreurs possibles
– Plus de tests unitaires + intégrations
• Mise en place par l'exemple
– J'ai fait le premier batch pour montrer la voie
– Un même vocabulaire aide à se comprendre
• Répond à nos besoins même si les batchs sont
différents au niveau métier
71. Retour d’expérience
Ekino
• Nos batchs « Spring Batch » sont en SQL plutôt
qu'en Hibernate
• Spring Batch s'occupe de la gestion
transactionnelle
• En moyenne
– 15% - 50% de gain sur le temps de développement
– 15% - 50% de gain au « runtime »
• Gains plus impressionnants sur certains cas
– XML 100Mo + SQL; Gain : de 60 mn à 8mn
– 10 fichiers 4Mo + SQL; Gain : de 10mn à 1mn30s
72. Des questions,
avant la suite ?
http://www.flickr.com/photos/crystaljingsr/3914729343/in/set-72157622354789320/
74. Recipe
Maître détail
Hop Hop Hop
R;Burton Ale;All Grain;Brad Smith
H;Goldings, East Kent;United Kingdom
H;Northern Brewer;Germany
H;Fuggles;United Kingdom
END
R;Dry Stout;All Grain;Brad Smith
H;Fuggles;United Kingdom
END
80. Allons plus loin…
Au choix!
• Un cas un peu plus complexe – maître
détail
• La reprise sur erreurs
• Un batch qui n’a pas un flow de
bisounours…
• Scaling et parallélisme
• Spring Batch et Hibernate
• Spring Batch Admin
81. Maître détail
R;Burton Ale;All Grain;Brad Smith
H;Goldings, East Kent;United Kingdom
H;Northern Brewer;Germany
H;Fuggles;United Kingdom
END
R;Dry Stout;All Grain;Brad Smith
H;Fuggles;United Kingdom
END
85. R;Burton Ale;All Grain;Brad Smith
H;Goldings, East Kent;United Kingdom
H;Northern Brewer;Germany
H;Fuggles;United Kingdom
END
R;Dry Stout;All Grain;Brad Smith
H;Fuggles;United Kingdom
END
87. A retenir
• Implémentation de notre propre reader
• Ré-utilisation d’un reader déjà fourni par
Spring Batch
• Ré-utilisation de ce que nous avons déjà
codé précédemment
89. Reprise sur erreur
• Un batch plus robuste (tolérant à l’erreur)
c’est un batch :
– Qui survit à quelques données invalides
– Qui survit à une indisponibilité
– Qu’on est en mesure de relancer
90. Reprise sur erreur
• Spring Batch out-of-the-box propose:
– Sauter les erreurs non bloquantes (skip)
– Recommencer un traitement (retry)
– Déterminer si le batch est fini (completion)
– Redémarrer un batch (restart)
92. Reprise sur erreur: Skip
0001;ABC;DEF;
0002;ABC;DEF;
000zxjgxdjghjsdfkud
0004;ABC;DEF;
• Ne pas arrêter le batch si la
lecture/process/écriture échoue
• Personnaliser les cas de « skip »
• Ecouter les cas de « skip »
93. Reprise sur erreur: Skip
– Si FlatFileException, Spring Batch skip l’item
– Skip de 10 items max
– Au-delà la step « failed »
– Include/Exclude possible
94. Reprise sur erreur: Skip
• Personnaliser la gestion du « skip »
• Par défaut: LimitCheckingItemSkipPolicy
96. Reprise sur erreur: Skip
• Un listener permet de traiter les items
écartés
• Les annotations existent aussi
– @OnSkipInRead
– @OnSkipInWrite
– @OnSkipInProcess
98. Reprise sur erreur: Retry
http://www.libertaland.com/2011/04/une-femme-de-75-ans-coupe-tout-linternet-en-armenie/
99. Reprise sur erreur: Retry
• Permet de relancer une opération si
indispo temporaire
• Personnaliser les cas de « retry »
• Ecouter les cas de « retry »
100. Reprise sur erreur: Retry
– Si DLDAE, Spring Batch recommence
– Retry 3 fois max
– Au-delà la step « failed »
– Include/Exclude possible
101. Reprise sur erreur: Retry
• Personnaliser le « retry »: RetryPolicy
– SimpleRetryPolicy (défaut)
• Stratégie entre 2 « retry »: BackoffPolicy
– NoBackOffPolicy (défaut)
– ExponentialBackOffPolicy vraiment utile
111. Reprise sur erreur:
Restart
• Spring Batch persiste régulièrement les
« ExecutionContext »
• Ceci permet à Spring Batch de savoir où
reprendre
• C’est ce qui fait qu’un batch est
« restartable »
112. Reprise sur erreur:
Restart
• Si vous voulez que vos Reader/Writer
custom soient restartables, vous devez
les concevoir restartables!
• Certains fournis par Spring Batch le sont,
mais pas tous
• Ce n’est pas toujours possible – ex: Writer
JMS.
115. Reprise sur erreur
Conclusion
• Nous avons appris comment:
– Ecarter des items défectueux (skip)
– Recommencer une step s’il y a une erreur
temporaire (retry)
– Implémenter notre propre stratégie de
« skip » et « retry »
– Redémarrer un job avec certains steps
124. Gestion du flow
• Batch Status
– Etat du job / step en cours d’exécution
• Exit Status
– Etat du job ou step après son exécution
– C’est lui qui détermine le flow
• Exemple
– COMPLETED, STARTING, STARTED,
STOPPING, STOPPED, FAILED,ABANDONED
or UNKNOWN
– C?T (CAT mais pas COUNT), C*T (CAT et COUNT)
125. Gestion du flow
• Créer et utiliser ses propres « exit status »
– StepExecutionListener
– JobDecider
126. Gestion du flow
• Utiliser ses propres « exit status »
StepA
COMPLETED WITH SKIPS
StepC
*
StepB
131. Gestion du flow
• « StepExecutionListener » ou
« JobExecutionDecider » ?
• JobExecutionDecider pour réutiliser plus
facilement la logique de branchement
133. Gestion du flow
• Partager des informations entre les steps
– À la Spring:bean classic
– A la Spring Batch: « Execution context »
• 1 pour le Job et 1 par Step
• C’est une Map sauvegardé dans les meta data
• Attention au volume
• Late bindings
– #{jobExecutionContext[‘myKey']}
139. Gestion du flow
• Conclusion, nous avons
– Fait des flows non linéaires
– Piloté l’enchaînement des steps
– Passé des données entre steps
– Mutualisé et réutilisé des jobs
143. Liens
• Spring User Group Paris
– http://groups.google.fr/group/sugfr
• Le code de la présentation
– https://github.com/obazoud/spring-batch-sug
• Spring Batch 2.1.x
– http://static.springsource.org/spring-batch
• Articles sur le web
– http://www.theserverside.com/news/1363855/Spring-Batch-Overview
– http://www.infoq.com/presentations/syer-introducing-spring-batch
– http://blog.zenika.com/index.php?post/2010/03/05/To-batch-or-not-to-
batch
– http://blog.octo.com/spring-batch-par-quel-bout-le-prendre/
146. Quizz 1
Ce que n'est pas Spring Batch ?
1. un framework orienté batchs
2. un scheduler
3. un framework open source
147. Quizz 2
Qui est le principal leader du
projet Spring Batch ?
1. Antonio Goncalves
2. Obi-wan Kenobi
3. Dave Syer
148. Quizz 3
Comment s'appelle le format
standard de description de
recette de bière ?
1. BeerXML
2. ISO-1664
3. ChtixML
149. Quizz 4
Qui vous offre un exemplaire de
« Spring Batch in Action »?
1. Sais pas, je viens de me réveiller
2. Ekino
3. Chubaka
150. Quizz 5
Comment s'appelle la console
d’admin de Spring Batch ?
1. Coldfusion Web Console
2. Spring Batch Admin
3. PlayScala
151. Quizz 6
Qui vous offre le buffet de cette
session ?
1. Sais pas, je viens de me réveiller
(mais c’est vrai qu’il fait faim!)
2. Linus Torvald
3. Ekino
156. Spring Batch et
Hibernate
• Raison d’utiliser Hibernate avec Spring
Batch: code existant rapidité de
développement
• Ca ne se fait pas sans dangers…
157. Spring Batch et
Hibernate
• Overhead de Hibernate sur JDBC
• Hibernate est stateful (par défaut)
– 1M d’items lus = 1M maintenus en RAM
OutOfMemoryError
158. Spring Batch et
Hibernate
Correctifs possibles pour pb stateful:
• Ne pas faire d’Hibernate ;-)
• Utiliser HibernateCustomItemReader
– Session stateless
• Ajuster le commit interval
159. Spring Batch et
Hibernate
• OK je suis un bon élève, j’utilise
HibernateCursorItemReader
• Maintenant, je fonce…
• Mais attention au select N+1
160. Spring Batch et Hibernate
• Pattern: « Driving Query Based
ItemReaders »
• Certaines bases de données (ex: DB2)
– Pessimitic looking
– Ouverture de curseurs sur des données
importantes
• Bonne pratique avec Hibernate
• Prévient les LazyException
161. Spring Batch et Hibernate
• Principe
– Le reader lit les ids via SQL
• Select id from XXX where …
– Le premier ItemProcessor transforme l’id en
objet via Hibernate par exemple
– Les autres processors font les traitements
métiers
–…
162.
163. Spring Batch Admin
• Console Web pour Spring Batch
– « Standalone » ou « Embedded »
– API Rest
– Uploader une nouvelle configuration
– Uploader un fichier à traiter
• « Customisable »
– Base de données, Branding, UI, ..
• Monitorer les batchs
171. Spring Batch Admin /
Monitoring
• JMX / MBean
– BatchMBeanExporter
• Exporter un jobService
• Voir les métriques des « Job/Steps Executions »
– SLA StepExecutionServiceLevelMonitor
• Permet de recevoir des notifications JMX si une
Step met trop de temps
• Utilisable aussi en Standalone
177. Scaling
• Différentes stratégies possibles
– Multi-threaded Step (single process)
– Parallel Steps (single process)
– Remote Chunking of Step (multi process)
– Partitioning a Step (single or multi process)
178. Scaling
• Multi-threaded Step
– Une Step est multi threaded
• Parallel Steps
– Les Steps sont exécutées en parallèle
• Remote Chunking of Step
– Distribution des chunks
• Partitioning a Step
– Partage les données à travers les noeuds
179. Scaling: Multi-threaded Step
– Multi thread au niveau « Step »
– Utilise un ThreadPoolTaskExecutor
– Chaque thread construit un chunk
– Les readers/writers sont thread-safe ?
• La plus part non, ils sont stateful
– « Process Indicator Pattern »
• Lire les items ‘processed’ = false
• Un ItemProcessor met ‘processed = true’
181. Scaling: Step en parallèle
• Executer plusieurs Step en parallèle
• Mot clé « split » dans la configuration
• Possibilité utiliser un
ThreadPoolTaskExecutor
183. Scaling: Remote Chunking
• Répartition de la charge vers des slaves
• Principe
– Lecture sur le Master
– Processor et Writer sur les slaves
• Spring Batch propose que des interfaces
• Spring Integration propose une
implementation
• La communication master/slave se fait à
travers un MOM