breizhjug spring batch 2011
Post on 14-Dec-2014
922 Views
Preview:
DESCRIPTION
TRANSCRIPT
Copyright © BreizhJug
Spring BatchLundi 6 Juin 2011
Copyright © BreizhJug
Intervenants
Olivier Bazoud, @obazoud, Ekino (FullSIX Group)Architecte technique de sites web à fort traffic
Java EE / Spring, Spring Batch, Groovy, Grails
Co-auteur de « Spring Batch in Action »
Spring User Group France
Julien Jakubowski, @jak78, OCTO TechnologyArchitecte technique
Spécialisé Java EE / Spring
Productivité et qualité des développements
Ch'ti JUG, Agile Tour Lille
Copyright © BreizhJug
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/
Copyright © BreizhJug
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
Copyright © BreizhJug
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• Questions / réponses
Copyright © BreizhJug
Batch : de quoi parle-t-on ?
Batch processing = suite de traitements sur ensemble de données…
Copyright © BreizhJug
Batch : de quoi parle-t-on ?
… potentiellement grands volumes…
http://www.flickr.com/photos/claudiasofia99/2878579560/
Copyright © BreizhJug
Batch : de quoi parle-t-on ?
… sans intervention d’un utilisateur humain – pas d’interface homme-machine
Copyright © BreizhJug
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• …
Copyright © BreizhJug
Batch : de quoi parle-t-on ?
Un batch n’est pas un scheduler• Cron, Quartz, $U…• Mais un scheduler peut le lancer
Copyright © BreizhJug
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
Copyright © BreizhJug
Problèmes récurrents• Fiabilité
Copyright © BreizhJug
Problèmes récurrents• Maintenabilité
Copyright © BreizhJug
Problèmes récurrents• Réinvention de la roue… carrée
Copyright © BreizhJug
Quand j’écris une application web…
Copyright © BreizhJug
Quand j’accède à une base de données…
Copyright © BreizhJug
Et quand j’écris un batch ?
http://www.flickr.com/photos/crystaljingsr/3914729343/sizes/o/in/set-72157622354789320/
Je suis… à poil ?
Copyright © BreizhJug
Et quand j’écris un batch ?
Spring Batch offre pourtant une solution pour vous guider lors de l’écriture de vos batchs en Java
Copyright © BreizhJug
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
PartitionnementSpring Batch Admin
Copyright © BreizhJug
Spring BatchNotions de base
Copyright © BreizhJug
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
Copyright © BreizhJug
Schéma du batch
RecipeStep
InitialStep
InitialTasklet
Chunk oriented tasklet
ItemReader ItemWriterItemProcessor
Copyright © BreizhJug
ItemReader
RecipeStep
InitialStep
InitialTasklet
Chunk oriented tasklet
ItemReader ItemWriterItemProcessorItemReader
Copyright © BreizhJug
ItemReader• Besoin
– Lire le XML de recettes
• ItemReader– Fournit des items en entrée
<xml>
123;AB;456;CD;
SELECT ... FROM ...
Copyright © BreizhJug
Morceaux de code
Copyright © BreizhJug
ItemProcessor
RecipeStep
InitialStep
InitialTasklet
Chunk oriented tasklet
ItemReader ItemWriterItemProcessor
Copyright © BreizhJug
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 »
Copyright © BreizhJug
Morceaux de code
Copyright © BreizhJug
Morceaux de code
Copyright © BreizhJug
ItemWriter
RecipeStep
InitialStep
InitialTasklet
Chunk oriented tasklet
ItemReader ItemProcessor ItemWriter
Copyright © BreizhJug
ItemWriter• Besoin
– Décharge les bières dans une base SQL
• ItemWriter– Ecrit les items
<xml>
123;AB;456;CD;
INSERT... INTO ...
Copyright © BreizhJug
Morceaux de code
Copyright © BreizhJug
Chunk
RecipeStep
InitialStep
InitialTasklet
Chunk oriented tasklet
ItemReader ItemProcessor ItemWriter
Copyright © BreizhJug
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
Copyright © BreizhJug
Chunk
Copyright © BreizhJug
Traitement par lots
Copyright © BreizhJug
Morceaux de code
Copyright © BreizhJug
Listener
RecipeStep
InitialStep
InitialTasklet
Chunk oriented tasklet
ItemReader ItemProcessor ItemWriter
Copyright © BreizhJug
Listener
• Besoin– Création d’un fichier de rejet
• Listener– Etre à l’écoute des évènements du batch
Copyright © BreizhJug
Morceaux de code
Copyright © BreizhJug
Morceaux de code
Copyright © BreizhJug
Morceaux de code
Copyright © BreizhJug
Tasklet
RecipeStep
InitialStep
Chunk oriented tasklet
ItemReader ItemProcessor ItemWriter
InitialTasklet
Copyright © BreizhJug
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
Copyright © BreizhJug
Morceaux de code
Copyright © BreizhJug
Step
RecipeStep
InitialStep
Chunk oriented tasklet
ItemReader ItemProcessor ItemWriter
InitialTasklet
Copyright © BreizhJug
Step
• Besoin– Etape dans le processus du batch– Contrôle le workflow
Copyright © BreizhJug
Job
RecipeStep
InitialStep
Chunk oriented tasklet
ItemReader ItemProcessor ItemWriter
InitialTasklet
Copyright © BreizhJug
Job
• Besoin– Décrire les étapes du batch– Composé d’un ou plusieurs steps
Spring Tools Suite
Copyright © BreizhJug
Morceaux de code
Copyright © BreizhJug
Lancer un jobdirectement
Copyright © BreizhJug
Lancer un jobvia un scheduler
On utilise ici Spring Scheduler.Il est indépendant de Spring Batch
Copyright © BreizhJug
Lancer un jobvia un scheduler
Copyright © BreizhJug
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
Copyright © BreizhJug
Morceaux de code
Copyright © BreizhJug
Morceaux de code
Copyright © BreizhJug
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, Spring Intégration✔Productivité, à terme...✗… après avoir payé le ticket d'entrée
Copyright © BreizhJug
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
Copyright © BreizhJug
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
Copyright © BreizhJug
Des questions,avant la suite ?
http://www.flickr.com/photos/crystaljingsr/3914729343/in/set-72157622354789320/
Copyright © BreizhJug
Spring BatchAllons plus loin
Copyright © BreizhJug
Allons plus loin…
• Un cas un peu plus complexe – maître détail
• La reprise sur erreurs• Un batch qui n’a pas un flow de
bisounours…• Aperçu du parallélisme et du
partitionnement
Copyright © BreizhJug
Maître détail
R;Burton Ale;All Grain;Brad SmithH;Goldings, East Kent;United KingdomH;Northern Brewer;GermanyH;Fuggles;United KingdomENDR;Dry Stout;All Grain;Brad SmithH;Fuggles;United KingdomEND
Copyright © BreizhJug
Maître détail
RecipeStep
Chunk oriented tasklet
ItemReader ItemWriterItemProcessor
Copyright © BreizhJug
Maître détailDéclaration du Job
Copyright © BreizhJug
Maître détailDéclaration du reader custom
Copyright © BreizhJug
R;Burton Ale;All Grain;Brad SmithH;Goldings, East Kent;United KingdomH;Northern Brewer;GermanyH;Fuggles;United KingdomENDR;Dry Stout;All Grain;Brad SmithH;Fuggles;United KingdomEND
Copyright © BreizhJug
Maître détailDéclaration du reader délégué
Copyright © BreizhJug
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
Copyright © BreizhJug
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
Copyright © BreizhJug
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)
Copyright © BreizhJug
Reprise sur erreur: Skip
• Ne pas arrêter le batch si la lecture/process/écriture échoue
• Personnaliser les cas de « skip »• Ecouter les cas de « skip »
0001;ABC;DEF;0002;ABC;DEF;000zxjgxdjghjsdfkud0004;ABC;DEF;
Copyright © BreizhJug
Reprise sur erreur: Skip
– Si FlatFileException, Spring Batch skip l’item– Skip de 10 items max– Au-delà la step « failed »– Include/Exclude possible
Copyright © BreizhJug
Reprise sur erreur: Skip
• Personnaliser la gestion du « skip »• Par défaut: LimitCheckingItemSkipPolicy
Copyright © BreizhJug
Reprise sur erreur: Skip
• Configuration de la gestion du « skip »
Copyright © BreizhJug
Reprise sur erreur: Skip
• Un listener permet de traiter les items écartés
• Les annotations existent aussi– @OnSkipInRead– @OnSkipInWrite– @OnSkipInProcess
Copyright © BreizhJug
Reprise sur erreur: Retry
http://www.libertaland.com/2011/04/une-femme-de-75-ans-coupe-tout-linternet-en-armenie/
Copyright © BreizhJug
Reprise sur erreur: Retry
• Permet de relancer une opération si indispo temporaire
• Personnaliser les cas de « retry »• Ecouter les cas de « retry »
Copyright © BreizhJug
Reprise sur erreur: Retry
– Si DLDAE, Spring Batch recommence– Retry 3 fois max– Au-delà la step « failed »– Include/Exclude possible
Copyright © BreizhJug
Reprise sur erreur: Retry
• Personnaliser le « retry »: RetryPolicy– SimpleRetryPolicy (défaut)
• Stratégie entre 2 « retry »: BackoffPolicy– NoBackOffPolicy (défaut)– ExponentialBackOffPolicy vraiment utile
Copyright © BreizhJug
Reprise sur erreur: Retry
• Configuration de la gestion du « retry »
Copyright © BreizhJug
Reprise sur erreur: Retry
• Un listener permet de traiter les « retry »
Copyright © BreizhJug
Reprise sur erreur: Retry
• Pour les tasklets– RetryTemplate– RetryOperationsInterceptor avec de l’AOP
Copyright © BreizhJug
Reprise sur erreur: Restart
• Même avec skip/retry, un batch peut planter
• Il reste encore une solution • Nous pouvons redémarrer le batch
Copyright © BreizhJug
Reprise sur erreur: Restart
• Spring batch stocke des méta data
Copyright © BreizhJug
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 »
Copyright © BreizhJug
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.
Copyright © BreizhJug
Reprise sur erreur: Restart
• ItemStream
Copyright © BreizhJug
Reprise sur erreur: Restart
• Exemple de Reader « restartable »
Copyright © BreizhJug
Reprise sur erreurConclusion
• Nous savons:– Ecarter des items défectueux (skip)– Recommencer un 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
Copyright © BreizhJug
Gestion du flow
Le « batch bisounours »
Step A
Step B
Copyright © BreizhJug
Gestion du flow
Exemple
Copyright © BreizhJug
Gestion du flow
Exemple
Copyright © BreizhJug
Gestion du flow• Le « batch complexe»
Step
Step
Step
Step
Step
Step
Step
Step
Step
Copyright © BreizhJug
Gestion du flow
• Comment…– faire des flows non linéaires– piloter l’enchaînement des steps– passer des données entre steps
Copyright © BreizhJug
Gestion du flow
• Exemple plus simple ;)
StepA
StepB
StepAlertFAILED
*
Copyright © BreizhJug
Gestion du flow
Copyright © BreizhJug
Gestion du flow
• Batch Status– Représente le status du job ou step
• Exit Status– Représente le status du job ou step au final
• Exemple– COMPLETED, STARTING, STARTED,
STOPPING, STOPPED, FAILED,ABANDONED or UNKNOWN
– C?T (CAT mais pas COUNT), C*T (CAT et COUNT)
Copyright © BreizhJug
Gestion du flow
• Créer et utiliser ses propres « exit status » – StepExecutionListener– JobDecider
Copyright © BreizhJug
Gestion du flow
• Utiliser ses propres « exit status »
StepA
StepB
StepC
COMPLETED WITH SKIPS
*
Copyright © BreizhJug
Gestion du flow
• « exit status » + StepExecutionListener
Copyright © BreizhJug
Gestion du flow• Configuration
Copyright © BreizhJug
Gestion du flow
• « exit status » + JobExecutionDecider
Copyright © BreizhJug
Gestion du flow• Configuration
Copyright © BreizhJug
Gestion du flow
• Alors « StepExecutionListener » ou « JobExecutionDecider » ?– Le exit status du step est stocké comme meta
data– Pas de « late binding » avec le
JobExecutionDecider
Copyright © BreizhJug
Gestion du flow
• Encore plus de contrôle: end, fail
Copyright © BreizhJug
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']}
Copyright © BreizhJug
Gestion du flow
• Accès à ExecutionContext
Copyright © BreizhJug
Gestion du flow
• Configuration
Copyright © BreizhJug
Gestion du flow
• Mutualiser les flowsStep A
Step B
Step C
Step D
MonFlow
Copyright © BreizhJug
Gestion du flow• Configuration
Copyright © BreizhJug
Gestion du flow• Réutiliser un Job
Copyright © BreizhJug
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
Copyright © BreizhJug
Scaling
http://www.flickr.com/photos/claudiasofia99/2878579560/
Copyright © BreizhJug
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)
Copyright © BreizhJug
Spring Batch in Actionhttp://www.manning.com/templier
Copyright © BreizhJug
Liens• Spring User Group Paris
– http://groups.google.fr/group/sugfr
• Le code de la présentation– http://code.google.com/p/fr-sug-spring-batch
• 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/
Copyright © BreizhJug
Questions ?
http://www.flickr.com/photos/crystaljingsr/3914729343/in/set-72157622354789320/
Copyright © BreizhJug
ROTI
http://www.flickr.com/photos/34943981@N00/202923614/
top related