Pour finir l'année en beauté, le Spring User Groupe FR vous propose de nous retrouver le Mardi 20 Décembre 2011 à 19h00 pour une session sur "Spring Batch Avancé". Lors de la première présentation (http://www.slideshare.net/sugfrance/spring-batch-concepts-de-base), nous avons vu les concepts de base de "Spring Batch".
Lors de cette session nous vous proposons d'aborder les notions avancés de "Spring Batch" en tenant compte de vos suggestions (voir le Google Moderator http://www.google.com/moderator/#16/e=5f36). A la fin de la conférence, nous vous proposerons un quizz afin de gagner quelques exemplaires de "Spring Batch in Action" (A.Cogoluegnes, T. Templier, G. Gregory, O. Bazoud), offerts par la société Ekino (http://www.ekino.com / @3k1n0).
Olivier Bazoud / @obazoud est architecte logiciel chez Ekino (http://www.ekino.com), spécialisé dans les technologies Java/JEE/Spring. Fort de 12 ans d’expérience, Olivier est en charge de l’architecture technique de sites et d'applications web à très fort traffic.
Julien Jakubowski / @jak78 est architecte chez OCTO Technology. Il a 10 ans d'expérience acquise au sein de projets à fort engagement pour des grands comptes, dans des secteurs d'activités variés : banque, assurance, industrie, grande distribution...
Julien accompagne ses clients sur des problématiques d'architecture, d'expertise technique, et de productivité des développements.
Il est également co-fondateur et président du Ch'ti JUG (Java User Group de la région Lilloise), qui rassemble tous les mois plus de 100 passionnés de technologies Java.
Kanban pour maîtriser le développement incrémental
Spring Batch Avance
1. SUGF Spring User Group France
Spring Batch Avancé
Mardi 20 Décembre 2011
Olivier Bazoud
Julien Jakubowski
2. SUGF
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
3. SUGF
De quoi va-t-on parler ce soir ?
• On va parler de batchs en Java
• des techniques avancés
• … et aussi (un peu) de bière
http://www.flickr.com/photos/fromeyetopixel/2559391584/
4. SUGF
Nos objectifs
En sortant de la salle, vous savez:
Identifier certains problèmes récurrents avec les
batchs écrits en Java
Si Spring Batch est utile pour vous (ou pas)
Intégrer les notions principales
Intégrer les notions avancées
Faire un batch « Spring Batch » dès demain
5. SUGF
Ce qui vous attend
• Rappel de l’épisode précédent
• Notions avancées – Vote
• Questions / Réponses
6. SUGF
Concepts de base
Rappel de l’épisode précédent (?)
7. SUGF
Batch : de quoi parle-t-on ?
Batch processing = répétition de traitements sur
un ensemble de données…
8. SUGF
Batch : de quoi parle-t-on ?
… potentiellement grands volumes…
http://www.flickr.com/photos/claudiasofia99/2878579560/
9. SUGF
Batch : de quoi parle-t-on ?
… sans intervention d’un utilisateur humain – pas
d’interface homme-machine
10. SUGF
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
11. SUGF
Batch : de quoi parle-t-on ?
Un batch n’est pas un scheduler
• Cron, inotify, Quartz, $U…
• Mais un scheduler peut le lancer
18. SUGF Exemple d’un batch
InitialStep
InitialTasklet
RecipeStep
Chunk oriented tasklet
ItemReader ItemProcessor ItemWriter
19. SUGF Tasklet
• Besoin
– Effectuer une tâche unitaire
• Exemples
– Unzip d’un fichier
– Appel d’une procédure stockée
– Appel d’un web service
20. SUGF
ItemReader
• Besoin
– Lire le XML de recettes au format BeerXML
• ItemReader
– Fournit des items en entrée
<xml> SELECT ... FROM ...
123;AB;
456;CD;
21. SUGF
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 »
22. SUGF
ItemWriter
• Besoin
– Décharge les bières dans une base SQL
• ItemWriter
– Ecrit les items
<xml> INSERT... INTO ...
123;AB;
456;CD;
23. SUGF
Chunk
• Besoin
– Lire, transformer et écrire
• Chunk
1. Lire et transformer les données successivement
2. Ecrire le lot de données
– Le commit-interval définit la taille du lot
– Gestion de la transaction : Commit/Rollback
25. SUGF Job
• Besoin
– Décrire les étapes du batch
– Composé d’un ou plusieurs Steps
Spring Tools Suite
26. SUGF Exemple d’un batch
InitialStep
InitialTasklet
RecipeStep
Chunk oriented tasklet
ItemReader ItemProcessor ItemWriter
27. SUGF
Tests
• Tests unitaires facilités via le découpage Spring Batch
– writers, processors etc...
• Tests d'intégration facilités par Spring
– @RunWith
– Step, Job
28. SUGF
Forces et faiblesses
✔Fiabilité et bons patterns
✔Tests unitaires et d'intégration, TDD
✔...the Spring way, intégration à Spring
✔Batchs complexes mieux maintenables
✔Bénéficie de fonctions avancées à moindre coût
✔Productivité, à terme...
✗… après avoir payé le ticket d'entrée
29. Des questions,
SUGF
avant la suite ?
http://www.flickr.com/photos/crystaljingsr/3914729343/in/set-72157622354789320/
31. Recipe
SUGF
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
32. SUGF Un batch plus robuste
reprise sur erreurs
37. SUGF
Allons plus loin…
• Un cas un peu plus complexe
– maître / détail
• La reprise sur erreurs
• Un flow qui n’est pas de bisounours…
• Spring Batch Admin (et Monitoring)
• Scaling et parallélisme
• Spring Batch et Hibernate
38. Recipe
SUGF
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
…
40. SUGF
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
42. SUGF 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
ou
• Spring Batch pense à vous
– PatternMatchingCompositeLineTokenizer
44. SUGF
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
45. SUGF
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)
47. SUGF
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 »
48. SUGF
Reprise sur erreur: Skip
– Si FlatFileException, Spring Batch skip l’item
– Skip de 10 items max
– Au-delà la step « failed »
– Include/Exclude possible
49. SUGF
Reprise sur erreur: Skip
• Personnaliser la gestion du « skip »
• Par défaut: LimitCheckingItemSkipPolicy
50. SUGF
Reprise sur erreur: Skip
• Configuration de la gestion du « skip »
51. SUGF
Reprise sur erreur: Skip
• Un listener permet de traiter les items
écartés
• Les annotations existent aussi
– @OnSkipInRead
– @OnSkipInWrite
– @OnSkipInProcess
53. SUGF
Reprise sur erreur: Retry
• Permet de relancer une opération si
indispo temporaire
• Personnaliser les cas de « retry »
• Ecouter les cas de « retry »
54. SUGF
Reprise sur erreur: Retry
– Si DLDAE, Spring Batch recommence
– Retry 3 fois max
– Au-delà la step « failed »
– Includes/Excludes possible
60. SUGF Reprise sur erreur:
Restart
• Même avec skip/retry, un batch peut
planter
• Il reste encore une solution
• Nous pouvons redémarrer le batch
61. SUGF Reprise sur erreur:
Restart
• Indique si le job est « restartable »
• Indique le nombre max de « restart »
62. SUGF Reprise sur erreur:
Restart
• La step est démarrée lors du restart même
si elle a été terminée correctement
63. SUGF Reprise sur erreur:
Restart
• Comment reprendre en plein milieu d’un
chunk ?
• Comment Spring Batch sait il où reprend ?
64. SUGF Reprise sur erreur:
Restart
• Spring batch stocke des méta data
65. SUGF 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 »
66. SUGF 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.
68. SUGF
Reprise sur erreur: Restart
• Exemple de Reader « restartable »
69. SUGF 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
78. SUGF
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)
79. SUGF
Gestion du flow
• Créer et utiliser ses propres « exit status »
– StepExecutionListener
– JobDecider
80. SUGF
Gestion du flow
• Utiliser ses propres « exit status »
StepA
COMPLETED WITH SKIPS
StepC
*
StepB
81. SUGF
Gestion du flow
• « exit status » + StepExecutionListener
85. SUGF
Gestion du flow
• « StepExecutionListener » ou
« JobExecutionDecider » ?
• JobExecutionDecider pour réutiliser plus
facilement la logique de branchement
86. SUGF
Gestion du flow
• Encore plus de contrôle: end, fail
87. SUGF
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']}
88. SUGF
Gestion du flow
• Accès à ExecutionContext
93. SUGF
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
94. SUGF
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
102. SUGF 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
108. SUGF
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)
109. SUGF
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
110. SUGF
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’
112. SUGF
Scaling: Step en parallèle
• Executer plusieurs Step en parallèle
• Mot clé « split » dans la configuration
• Possibilité utiliser un
ThreadPoolTaskExecutor
114. SUGF
Scaling: Remote Chunking
• Répartition de la charge vers des slaves
– Lecture sur le Master
– Processor et Writer sur les slaves
• Spring Batch propose des
interfaces/classes
• Spring Integration propose une
implementation
• La relation master/slave : MOM
– ActiveMQ, RabbitMQ, …
121. SUGF Spring Batch et
Hibernate
• Les raisons
– code existant
– rapidité de développement (les premiers 80%)
• Ca ne se fait pas sans dangers…
122. SUGF Spring Batch et
Hibernate
• Votre mapping Hibernate est il fait pour
du batch ?
– Ai-je besoin de tous les fetchs ?!
– Select N+1 ?!
• Overhead de Hibernate sur JDBC
123. SUGF Spring Batch et
Hibernate
• Hibernate est stateful (par défaut)
– 1M d’items lus = 1M en RAM OutOfMemoryError
• Utiliser HibernateCursorItemReader
– 1 requête HQL
– Session stateless
124. SUGF
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
125. SUGF
Spring Batch et Hibernate
• Principe
– L’ItemReader lit les « id » 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
–…
128. SUGF Spring Batch in Action
http://www.manning.com/templier
129. SUGF
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
130. SUGF
Quizz 1
Ce que n'est pas Spring Batch ?
1. un framework orienté batchs
2. un scheduler
3. un framework open source
131. SUGF
Quizz 2
Qui est le principal leader du
projet Spring Batch ?
1. Antonio Goncalves
2. Obi-wan Kenobi
3. Dave Syer
132. SUGF
Quizz 3
Comment s'appelle la console
d’admin de Spring Batch ?
1. Coldfusion Web Console
2. Spring Batch Admin
3. PlayScalaInCloud
133. SUGF
Quizz 4
Quel est l’objet qui n’existe pas
en « Spring Batch » ?
1. ItemReader
2. ItemWriter
3. ItemBien
134. SUGF
Quizz 5
Qui vous offre un exemplaire de
« Spring Batch in Action »?
1. Sais pas, je viens de me réveiller
2. Ekino
3. Le père Noël
135. SUGF
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/