breizhjug spring batch 2011

Post on 14-Dec-2014

922 Views

Category:

Technology

2 Downloads

Preview:

Click to see full reader

DESCRIPTION

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

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