Breizhjug spring batch 2011

119
Copyright © BreizhJug Spring Batch Lundi 6 Juin 2011

description

Présentation de Spring Batch au Breizhjug par @obazoud et @jak78

Transcript of Breizhjug spring batch 2011

Page 1: Breizhjug spring batch 2011

Copyright © BreizhJug

Spring BatchLundi 6 Juin 2011

Page 2: Breizhjug spring batch 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

Page 3: Breizhjug spring batch 2011

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/

Page 4: Breizhjug spring batch 2011

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

Page 5: Breizhjug spring batch 2011

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

Page 6: Breizhjug spring batch 2011

Copyright © BreizhJug

Batch : de quoi parle-t-on ?

Batch processing = suite de traitements sur ensemble de données…

Page 7: Breizhjug spring batch 2011

Copyright © BreizhJug

Batch : de quoi parle-t-on ?

… potentiellement grands volumes…

http://www.flickr.com/photos/claudiasofia99/2878579560/

Page 8: Breizhjug spring batch 2011

Copyright © BreizhJug

Batch : de quoi parle-t-on ?

… sans intervention d’un utilisateur humain – pas d’interface homme-machine

Page 9: Breizhjug spring batch 2011

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• …

Page 10: Breizhjug spring batch 2011

Copyright © BreizhJug

Batch : de quoi parle-t-on ?

Un batch n’est pas un scheduler• Cron, Quartz, $U…• Mais un scheduler peut le lancer

Page 11: Breizhjug spring batch 2011

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

Page 12: Breizhjug spring batch 2011

Copyright © BreizhJug

Problèmes récurrents• Fiabilité

Page 13: Breizhjug spring batch 2011

Copyright © BreizhJug

Problèmes récurrents• Maintenabilité

Page 14: Breizhjug spring batch 2011

Copyright © BreizhJug

Problèmes récurrents• Réinvention de la roue… carrée

Page 15: Breizhjug spring batch 2011

Copyright © BreizhJug

Quand j’écris une application web…

Page 16: Breizhjug spring batch 2011

Copyright © BreizhJug

Quand j’accède à une base de données…

Page 17: Breizhjug spring batch 2011

Copyright © BreizhJug

Et quand j’écris un batch ?

http://www.flickr.com/photos/crystaljingsr/3914729343/sizes/o/in/set-72157622354789320/

Je suis… à poil ?

Page 18: Breizhjug spring batch 2011

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

Page 19: Breizhjug spring batch 2011

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

Page 20: Breizhjug spring batch 2011

Copyright © BreizhJug

Spring BatchNotions de base

Page 21: Breizhjug spring batch 2011

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

Page 22: Breizhjug spring batch 2011

Copyright © BreizhJug

Schéma du batch

RecipeStep

InitialStep

InitialTasklet

Chunk oriented tasklet

ItemReader ItemWriterItemProcessor

Page 23: Breizhjug spring batch 2011

Copyright © BreizhJug

ItemReader

RecipeStep

InitialStep

InitialTasklet

Chunk oriented tasklet

ItemReader ItemWriterItemProcessorItemReader

Page 24: Breizhjug spring batch 2011

Copyright © BreizhJug

ItemReader• Besoin

– Lire le XML de recettes

• ItemReader– Fournit des items en entrée

<xml>

123;AB;456;CD;

SELECT ... FROM ...

Page 25: Breizhjug spring batch 2011

Copyright © BreizhJug

Morceaux de code

Page 26: Breizhjug spring batch 2011

Copyright © BreizhJug

ItemProcessor

RecipeStep

InitialStep

InitialTasklet

Chunk oriented tasklet

ItemReader ItemWriterItemProcessor

Page 27: Breizhjug spring batch 2011

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 »

Page 28: Breizhjug spring batch 2011

Copyright © BreizhJug

Morceaux de code

Page 29: Breizhjug spring batch 2011

Copyright © BreizhJug

Morceaux de code

Page 30: Breizhjug spring batch 2011

Copyright © BreizhJug

ItemWriter

RecipeStep

InitialStep

InitialTasklet

Chunk oriented tasklet

ItemReader ItemProcessor ItemWriter

Page 31: Breizhjug spring batch 2011

Copyright © BreizhJug

ItemWriter• Besoin

– Décharge les bières dans une base SQL

• ItemWriter– Ecrit les items

<xml>

123;AB;456;CD;

INSERT... INTO ...

Page 32: Breizhjug spring batch 2011

Copyright © BreizhJug

Morceaux de code

Page 33: Breizhjug spring batch 2011

Copyright © BreizhJug

Chunk

RecipeStep

InitialStep

InitialTasklet

Chunk oriented tasklet

ItemReader ItemProcessor ItemWriter

Page 34: Breizhjug spring batch 2011

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

Page 35: Breizhjug spring batch 2011

Copyright © BreizhJug

Chunk

Page 36: Breizhjug spring batch 2011

Copyright © BreizhJug

Traitement par lots

Page 37: Breizhjug spring batch 2011

Copyright © BreizhJug

Morceaux de code

Page 38: Breizhjug spring batch 2011

Copyright © BreizhJug

Listener

RecipeStep

InitialStep

InitialTasklet

Chunk oriented tasklet

ItemReader ItemProcessor ItemWriter

Page 39: Breizhjug spring batch 2011

Copyright © BreizhJug

Listener

• Besoin– Création d’un fichier de rejet

• Listener– Etre à l’écoute des évènements du batch

Page 40: Breizhjug spring batch 2011

Copyright © BreizhJug

Morceaux de code

Page 41: Breizhjug spring batch 2011

Copyright © BreizhJug

Morceaux de code

Page 42: Breizhjug spring batch 2011

Copyright © BreizhJug

Morceaux de code

Page 43: Breizhjug spring batch 2011

Copyright © BreizhJug

Tasklet

RecipeStep

InitialStep

Chunk oriented tasklet

ItemReader ItemProcessor ItemWriter

InitialTasklet

Page 44: Breizhjug spring batch 2011

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

Page 45: Breizhjug spring batch 2011

Copyright © BreizhJug

Morceaux de code

Page 46: Breizhjug spring batch 2011

Copyright © BreizhJug

Step

RecipeStep

InitialStep

Chunk oriented tasklet

ItemReader ItemProcessor ItemWriter

InitialTasklet

Page 47: Breizhjug spring batch 2011

Copyright © BreizhJug

Step

• Besoin– Etape dans le processus du batch– Contrôle le workflow

Page 48: Breizhjug spring batch 2011

Copyright © BreizhJug

Job

RecipeStep

InitialStep

Chunk oriented tasklet

ItemReader ItemProcessor ItemWriter

InitialTasklet

Page 49: Breizhjug spring batch 2011

Copyright © BreizhJug

Job

• Besoin– Décrire les étapes du batch– Composé d’un ou plusieurs steps

Spring Tools Suite

Page 50: Breizhjug spring batch 2011

Copyright © BreizhJug

Morceaux de code

Page 51: Breizhjug spring batch 2011

Copyright © BreizhJug

Lancer un jobdirectement

Page 52: Breizhjug spring batch 2011

Copyright © BreizhJug

Lancer un jobvia un scheduler

On utilise ici Spring Scheduler.Il est indépendant de Spring Batch

Page 53: Breizhjug spring batch 2011

Copyright © BreizhJug

Lancer un jobvia un scheduler

Page 54: Breizhjug spring batch 2011

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

Page 55: Breizhjug spring batch 2011

Copyright © BreizhJug

Morceaux de code

Page 56: Breizhjug spring batch 2011

Copyright © BreizhJug

Morceaux de code

Page 57: Breizhjug spring batch 2011

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

Page 58: Breizhjug spring batch 2011

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

Page 59: Breizhjug spring batch 2011

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

Page 60: Breizhjug spring batch 2011

Copyright © BreizhJug

Des questions,avant la suite ?

http://www.flickr.com/photos/crystaljingsr/3914729343/in/set-72157622354789320/

Page 61: Breizhjug spring batch 2011

Copyright © BreizhJug

Spring BatchAllons plus loin

Page 62: Breizhjug spring batch 2011

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

Page 63: Breizhjug spring batch 2011

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

Page 64: Breizhjug spring batch 2011

Copyright © BreizhJug

Maître détail

RecipeStep

Chunk oriented tasklet

ItemReader ItemWriterItemProcessor

Page 65: Breizhjug spring batch 2011

Copyright © BreizhJug

Maître détailDéclaration du Job

Page 66: Breizhjug spring batch 2011

Copyright © BreizhJug

Maître détailDéclaration du reader custom

Page 67: Breizhjug spring batch 2011

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

Page 68: Breizhjug spring batch 2011

Copyright © BreizhJug

Maître détailDéclaration du reader délégué

Page 69: Breizhjug spring batch 2011

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

Page 70: Breizhjug spring batch 2011

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

Page 71: Breizhjug spring batch 2011

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)

Page 72: Breizhjug spring batch 2011

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;

Page 73: Breizhjug spring batch 2011

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

Page 74: Breizhjug spring batch 2011

Copyright © BreizhJug

Reprise sur erreur: Skip

• Personnaliser la gestion du « skip »• Par défaut: LimitCheckingItemSkipPolicy

Page 75: Breizhjug spring batch 2011

Copyright © BreizhJug

Reprise sur erreur: Skip

• Configuration de la gestion du « skip »

Page 76: Breizhjug spring batch 2011

Copyright © BreizhJug

Reprise sur erreur: Skip

• Un listener permet de traiter les items écartés

• Les annotations existent aussi– @OnSkipInRead– @OnSkipInWrite– @OnSkipInProcess

Page 77: Breizhjug spring batch 2011

Copyright © BreizhJug

Reprise sur erreur: Retry

http://www.libertaland.com/2011/04/une-femme-de-75-ans-coupe-tout-linternet-en-armenie/

Page 78: Breizhjug spring batch 2011

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 »

Page 79: Breizhjug spring batch 2011

Copyright © BreizhJug

Reprise sur erreur: Retry

– Si DLDAE, Spring Batch recommence– Retry 3 fois max– Au-delà la step « failed »– Include/Exclude possible

Page 80: Breizhjug spring batch 2011

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

Page 81: Breizhjug spring batch 2011

Copyright © BreizhJug

Reprise sur erreur: Retry

• Configuration de la gestion du « retry »

Page 82: Breizhjug spring batch 2011

Copyright © BreizhJug

Reprise sur erreur: Retry

• Un listener permet de traiter les « retry »

Page 83: Breizhjug spring batch 2011

Copyright © BreizhJug

Reprise sur erreur: Retry

• Pour les tasklets– RetryTemplate– RetryOperationsInterceptor avec de l’AOP

Page 84: Breizhjug spring batch 2011

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

Page 85: Breizhjug spring batch 2011

Copyright © BreizhJug

Reprise sur erreur: Restart

• Spring batch stocke des méta data

Page 86: Breizhjug spring batch 2011

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 »

Page 87: Breizhjug spring batch 2011

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.

Page 88: Breizhjug spring batch 2011

Copyright © BreizhJug

Reprise sur erreur: Restart

• ItemStream

Page 89: Breizhjug spring batch 2011

Copyright © BreizhJug

Reprise sur erreur: Restart

• Exemple de Reader « restartable »

Page 90: Breizhjug spring batch 2011

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

Page 91: Breizhjug spring batch 2011

Copyright © BreizhJug

Gestion du flow

Le « batch bisounours »

Step A

Step B

Page 92: Breizhjug spring batch 2011

Copyright © BreizhJug

Gestion du flow

Exemple

Page 93: Breizhjug spring batch 2011

Copyright © BreizhJug

Gestion du flow

Exemple

Page 94: Breizhjug spring batch 2011

Copyright © BreizhJug

Gestion du flow• Le « batch complexe»

Step

Step

Step

Step

Step

Step

Step

Step

Step

Page 95: Breizhjug spring batch 2011

Copyright © BreizhJug

Gestion du flow

• Comment…– faire des flows non linéaires– piloter l’enchaînement des steps– passer des données entre steps

Page 96: Breizhjug spring batch 2011

Copyright © BreizhJug

Gestion du flow

• Exemple plus simple ;)

StepA

StepB

StepAlertFAILED

*

Page 97: Breizhjug spring batch 2011

Copyright © BreizhJug

Gestion du flow

Page 98: Breizhjug spring batch 2011

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)

Page 99: Breizhjug spring batch 2011

Copyright © BreizhJug

Gestion du flow

• Créer et utiliser ses propres « exit status » – StepExecutionListener– JobDecider

Page 100: Breizhjug spring batch 2011

Copyright © BreizhJug

Gestion du flow

• Utiliser ses propres « exit status »

StepA

StepB

StepC

COMPLETED WITH SKIPS

*

Page 101: Breizhjug spring batch 2011

Copyright © BreizhJug

Gestion du flow

• « exit status » + StepExecutionListener

Page 102: Breizhjug spring batch 2011

Copyright © BreizhJug

Gestion du flow• Configuration

Page 103: Breizhjug spring batch 2011

Copyright © BreizhJug

Gestion du flow

• « exit status » + JobExecutionDecider

Page 104: Breizhjug spring batch 2011

Copyright © BreizhJug

Gestion du flow• Configuration

Page 105: Breizhjug spring batch 2011

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

Page 106: Breizhjug spring batch 2011

Copyright © BreizhJug

Gestion du flow

• Encore plus de contrôle: end, fail

Page 107: Breizhjug spring batch 2011

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']}

Page 108: Breizhjug spring batch 2011

Copyright © BreizhJug

Gestion du flow

• Accès à ExecutionContext

Page 109: Breizhjug spring batch 2011

Copyright © BreizhJug

Gestion du flow

• Configuration

Page 110: Breizhjug spring batch 2011

Copyright © BreizhJug

Gestion du flow

• Mutualiser les flowsStep A

Step B

Step C

Step D

MonFlow

Page 111: Breizhjug spring batch 2011

Copyright © BreizhJug

Gestion du flow• Configuration

Page 112: Breizhjug spring batch 2011

Copyright © BreizhJug

Gestion du flow• Réutiliser un Job

Page 113: Breizhjug spring batch 2011

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

Page 114: Breizhjug spring batch 2011

Copyright © BreizhJug

Scaling

http://www.flickr.com/photos/claudiasofia99/2878579560/

Page 115: Breizhjug spring batch 2011

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)

Page 116: Breizhjug spring batch 2011

Copyright © BreizhJug

Spring Batch in Actionhttp://www.manning.com/templier

Page 117: Breizhjug spring batch 2011

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/

Page 118: Breizhjug spring batch 2011

Copyright © BreizhJug

Questions ?

http://www.flickr.com/photos/crystaljingsr/3914729343/in/set-72157622354789320/

Page 119: Breizhjug spring batch 2011

Copyright © BreizhJug

ROTI

http://www.flickr.com/photos/34943981@N00/202923614/