Spring Batch
                        Lundi 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 Technology
              Architecte 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




Copyright © BreizhJug
                        http://www.flickr.com/photos/fromeyetopixel/2559391584/
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 ?
                                                Je suis… à poil ?




                        http://www.flickr.com/photos/crystaljingsr/3914729343/sizes/o/in/set-72157622354789320/
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 (domainlanguage)
       • 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

Copyright © BreizhJug
Spring Batch
                        Notions 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
                                          InitialStep
                                         InitialTasklet




                                         RecipeStep
                                     Chunkorientedtasklet

                        ItemReader      ItemProcessor       ItemWriter




Copyright © BreizhJug
ItemReader
                                          InitialStep
                                         InitialTasklet




                                         RecipeStep
                                     Chunkorientedtasklet

                        ItemReader      ItemProcessor       ItemWriter




Copyright © BreizhJug
ItemReader
       • Besoin
              – Lire le XML de recettes
       • ItemReader
              – Fournit des items en entrée




                        <xml>                 SELECT ... FROM ...

                        123;AB;
                        456;CD;


Copyright © BreizhJug
Morceaux de code




Copyright © BreizhJug
ItemProcessor
                                          InitialStep
                                         InitialTasklet




                                         RecipeStep
                                     Chunkorientedtasklet

                        ItemReader      ItemProcessor       ItemWriter




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
                                          InitialStep
                                         InitialTasklet




                                         RecipeStep
                                     Chunkorientedtasklet

                        ItemReader      ItemProcessor       ItemWriter




Copyright © BreizhJug
ItemWriter
       • Besoin
              – Décharge les bières dans une base SQL
       • ItemWriter
              – Ecrit les items




                        <xml>                  INSERT... INTO ...

                        123;AB;
                        456;CD;


Copyright © BreizhJug
Morceaux de code




Copyright © BreizhJug
Chunk
                                          InitialStep
                                         InitialTasklet




                                         RecipeStep
                                     Chunkorientedtasklet

                        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
                                          InitialStep
                                         InitialTasklet




                                         RecipeStep
                                     Chunkorientedtasklet

                        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
                                          InitialStep
                                         InitialTasklet




                                         RecipeStep
                                     Chunkorientedtasklet

                        ItemReader      ItemProcessor       ItemWriter




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
                                          InitialStep
                                         InitialTasklet




                                         RecipeStep
                                     Chunkorientedtasklet

                        ItemReader      ItemProcessor          ItemWriter




Copyright © BreizhJug
Step

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




Copyright © BreizhJug
Job
                                          InitialStep
                                         InitialTasklet




                                         RecipeStep
                                     Chunkorientedtasklet

                        ItemReader      ItemProcessor           ItemWriter




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




Copyright © BreizhJug
                                  Spring Tools Suite
Morceaux de code




Copyright © BreizhJug
Lancer un job
                         directement




Copyright © BreizhJug
Lancer un job
                           via un scheduler

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




Copyright © BreizhJug
Lancer un job
                        via 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 Springway, 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 ?




Copyright © BreizhJug   http://www.flickr.com/photos/crystaljingsr/3914729343/in/set-72157622354789320/
Spring Batch
                         Allons 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;BurtonAle;AllGrain;Brad Smith
        H;Goldings, East Kent;UnitedKingdom
        H;NorthernBrewer;Germany
        H;Fuggles;UnitedKingdom
        END
        R;DryStout;AllGrain;Brad Smith
        H;Fuggles;UnitedKingdom
        END




Copyright © BreizhJug
Maître détail

                                         RecipeStep

                                     Chunkorientedtasklet

                        ItemReader      ItemProcessor       ItemWriter




Copyright © BreizhJug
Maître détail
                        Déclaration du Job




Copyright © BreizhJug
Maître détail
                        Déclaration du reader custom




Copyright © BreizhJug
R;BurtonAle;AllGrain;Brad Smith
                        H;Goldings, East Kent;UnitedKingdom
                        H;NorthernBrewer;Germany
                        H;Fuggles;UnitedKingdom
                        END
                        R;DryStout;AllGrain;Brad Smith
                        H;Fuggles;UnitedKingdom
                        END




Copyright © BreizhJug
Maître détail
                        Dé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
                        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 »


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 erreur
                             Conclusion
       • 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

                                     FAILED
                        StepAlert


                                                  *
                                              StepB




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

                             COMPLETED WITH SKIPS
                        StepC


                                                        *
                                                    StepB




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 « latebinding » 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:beanclassic
              – A la Spring Batch: « Executioncontext »
                        •   1 pour le Job et 1 par Step
                        •   C’est une Map sauvegardé dans les meta data
                        •   Attention au volume
                        •   Latebindings
                             – #{jobExecutionContext[‘myKey']}




Copyright © BreizhJug
Gestion du flow
       • Accès à ExecutionContext




Copyright © BreizhJug
Gestion du flow
       • Configuration




Copyright © BreizhJug
Gestion du flow
                                Step A
       • Mutualiser les flows

                                Step B    Mon
                                          Flow


                                Step C




                                Step D



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 Action
            http://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 ?




Copyright © BreizhJug
ROTI




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

Breizhjug spring batch 2011

  • 1.
    Spring Batch Lundi 6 Juin 2011 Copyright © BreizhJug
  • 2.
    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 Technology Architecte technique Spécialisé Java EE / Spring Productivité et qualité des développements Ch'ti JUG, Agile Tour Lille Copyright © BreizhJug
  • 3.
    De quoi va-t-onparler ce soir ? • On va parler de batchs en Java • … et aussi de bière Copyright © BreizhJug http://www.flickr.com/photos/fromeyetopixel/2559391584/
  • 4.
    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
  • 5.
    Ce qui vousattend • 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
  • 6.
    Batch : dequoi parle-t-on ? Batch processing = suite de traitements sur ensemble de données… Copyright © BreizhJug
  • 7.
    Batch : dequoi parle-t-on ? … potentiellement grands volumes… http://www.flickr.com/photos/claudiasofia99/2878579560/ Copyright © BreizhJug
  • 8.
    Batch : dequoi parle-t-on ? … sans intervention d’un utilisateur humain – pas d’interface homme-machine Copyright © BreizhJug
  • 9.
    Batch : dequoi 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
  • 10.
    Batch : dequoi parle-t-on ? Un batch n’est pas un scheduler • Cron, Quartz, $U… • Mais un scheduler peut le lancer Copyright © BreizhJug
  • 11.
    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
  • 12.
    Problèmes récurrents • Fiabilité Copyright © BreizhJug
  • 13.
    Problèmes récurrents • Maintenabilité Copyright © BreizhJug
  • 14.
    Problèmes récurrents • Réinvention de la roue… carrée Copyright © BreizhJug
  • 15.
    Quand j’écris une application web… Copyright © BreizhJug
  • 16.
    Quand j’accède àune base de données… Copyright © BreizhJug
  • 17.
    Et quand j’écrisun batch ? Je suis… à poil ? http://www.flickr.com/photos/crystaljingsr/3914729343/sizes/o/in/set-72157622354789320/ Copyright © BreizhJug
  • 18.
    Et quand j’écrisun batch ? Spring Batch offre pourtant une solution pour vous guider lors de l’écriture de vos batchs en Java Copyright © BreizhJug
  • 19.
    Spring Batch propose… • Un cadre • Un vocabulaire (domainlanguage) • 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 Copyright © BreizhJug
  • 20.
    Spring Batch Notions de base Copyright © BreizhJug
  • 21.
    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
  • 22.
    Schéma du batch InitialStep InitialTasklet RecipeStep Chunkorientedtasklet ItemReader ItemProcessor ItemWriter Copyright © BreizhJug
  • 23.
    ItemReader InitialStep InitialTasklet RecipeStep Chunkorientedtasklet ItemReader ItemProcessor ItemWriter Copyright © BreizhJug
  • 24.
    ItemReader • Besoin – Lire le XML de recettes • ItemReader – Fournit des items en entrée <xml> SELECT ... FROM ... 123;AB; 456;CD; Copyright © BreizhJug
  • 25.
  • 26.
    ItemProcessor InitialStep InitialTasklet RecipeStep Chunkorientedtasklet ItemReader ItemProcessor ItemWriter Copyright © BreizhJug
  • 27.
    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
  • 28.
  • 29.
  • 30.
    ItemWriter InitialStep InitialTasklet RecipeStep Chunkorientedtasklet ItemReader ItemProcessor ItemWriter Copyright © BreizhJug
  • 31.
    ItemWriter • Besoin – Décharge les bières dans une base SQL • ItemWriter – Ecrit les items <xml> INSERT... INTO ... 123;AB; 456;CD; Copyright © BreizhJug
  • 32.
  • 33.
    Chunk InitialStep InitialTasklet RecipeStep Chunkorientedtasklet ItemReader ItemProcessor ItemWriter Copyright © BreizhJug
  • 34.
    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
  • 35.
  • 36.
  • 37.
  • 38.
    Listener InitialStep InitialTasklet RecipeStep Chunkorientedtasklet ItemReader ItemProcessor ItemWriter Copyright © BreizhJug
  • 39.
    Listener • Besoin – Création d’un fichier de rejet • Listener – Etre à l’écoute des évènements du batch Copyright © BreizhJug
  • 40.
  • 41.
  • 42.
  • 43.
    Tasklet InitialStep InitialTasklet RecipeStep Chunkorientedtasklet ItemReader ItemProcessor ItemWriter Copyright © BreizhJug
  • 44.
    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
  • 45.
  • 46.
    Step InitialStep InitialTasklet RecipeStep Chunkorientedtasklet ItemReader ItemProcessor ItemWriter Copyright © BreizhJug
  • 47.
    Step • Besoin – Etape dans le processus du batch – Contrôle le workflow Copyright © BreizhJug
  • 48.
    Job InitialStep InitialTasklet RecipeStep Chunkorientedtasklet ItemReader ItemProcessor ItemWriter Copyright © BreizhJug
  • 49.
    Job • Besoin – Décrire les étapes du batch – Composé d’un ou plusieurs steps Copyright © BreizhJug Spring Tools Suite
  • 50.
  • 51.
    Lancer un job directement Copyright © BreizhJug
  • 52.
    Lancer un job via un scheduler On utilise ici SpringScheduler. Il est indépendant de Spring Batch Copyright © BreizhJug
  • 53.
    Lancer un job via un scheduler Copyright © BreizhJug
  • 54.
    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
  • 55.
  • 56.
  • 57.
    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 Springway, Spring Intégration ✔Productivité, à terme... ✗… après avoir payé le ticket d'entrée Copyright © BreizhJug
  • 58.
    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
  • 59.
    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
  • 60.
    Des questions, avant la suite ? Copyright © BreizhJug http://www.flickr.com/photos/crystaljingsr/3914729343/in/set-72157622354789320/
  • 61.
    Spring Batch Allons plus loin Copyright © BreizhJug
  • 62.
    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
  • 63.
    Maître détail R;BurtonAle;AllGrain;Brad Smith H;Goldings, East Kent;UnitedKingdom H;NorthernBrewer;Germany H;Fuggles;UnitedKingdom END R;DryStout;AllGrain;Brad Smith H;Fuggles;UnitedKingdom END Copyright © BreizhJug
  • 64.
    Maître détail RecipeStep Chunkorientedtasklet ItemReader ItemProcessor ItemWriter Copyright © BreizhJug
  • 65.
    Maître détail Déclaration du Job Copyright © BreizhJug
  • 66.
    Maître détail Déclaration du reader custom Copyright © BreizhJug
  • 67.
    R;BurtonAle;AllGrain;Brad Smith H;Goldings, East Kent;UnitedKingdom H;NorthernBrewer;Germany H;Fuggles;UnitedKingdom END R;DryStout;AllGrain;Brad Smith H;Fuggles;UnitedKingdom END Copyright © BreizhJug
  • 68.
    Maître détail Déclaration du reader délégué Copyright © BreizhJug
  • 69.
    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
  • 70.
    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
  • 71.
    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
  • 72.
    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 » Copyright © BreizhJug
  • 73.
    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
  • 74.
    Reprise sur erreur:Skip • Personnaliser la gestion du « skip » • Par défaut: LimitCheckingItemSkipPolicy Copyright © BreizhJug
  • 75.
    Reprise sur erreur:Skip • Configuration de la gestion du « skip » Copyright © BreizhJug
  • 76.
    Reprise sur erreur:Skip • Un listener permet de traiter les items écartés • Les annotations existent aussi – @OnSkipInRead – @OnSkipInWrite – @OnSkipInProcess Copyright © BreizhJug
  • 77.
    Reprise sur erreur:Retry http://www.libertaland.com/2011/04/une-femme-de-75-ans-coupe-tout-linternet-en-armenie/ Copyright © BreizhJug
  • 78.
    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
  • 79.
    Reprise sur erreur:Retry – Si DLDAE, Spring Batch recommence – Retry 3 fois max – Au-delà la step « failed » – Include/Exclude possible Copyright © BreizhJug
  • 80.
    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
  • 81.
    Reprise sur erreur:Retry • Configuration de la gestion du « retry » Copyright © BreizhJug
  • 82.
    Reprise sur erreur:Retry • Un listener permet de traiter les « retry » Copyright © BreizhJug
  • 83.
    Reprise sur erreur:Retry • Pour les tasklets – RetryTemplate – RetryOperationsInterceptor avec de l’AOP Copyright © BreizhJug
  • 84.
    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
  • 85.
    Reprise sur erreur: Restart • Spring batch stocke des méta data Copyright © BreizhJug
  • 86.
    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
  • 87.
    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
  • 88.
    Reprise sur erreur: Restart • ItemStream Copyright © BreizhJug
  • 89.
    Reprise sur erreur: Restart • Exemple de Reader « restartable » Copyright © BreizhJug
  • 90.
    Reprise sur erreur Conclusion • 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
  • 91.
    Gestion du flow Le « batch bisounours » Step A Step B Copyright © BreizhJug
  • 92.
    Gestion du flow Exemple Copyright © BreizhJug
  • 93.
    Gestion du flow Exemple Copyright © BreizhJug
  • 94.
    Gestion du flow • Le « batch complexe» Step Step Step Step Step Step Step Step Step Copyright © BreizhJug
  • 95.
    Gestion du flow • Comment… – faire des flows non linéaires – piloter l’enchaînement des steps – passer des données entre steps Copyright © BreizhJug
  • 96.
    Gestion du flow • Exemple plus simple ;) StepA FAILED StepAlert * StepB Copyright © BreizhJug
  • 97.
  • 98.
    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
  • 99.
    Gestion du flow • Créer et utiliser ses propres « exit status » – StepExecutionListener – JobDecider Copyright © BreizhJug
  • 100.
    Gestion du flow • Utiliser ses propres « exit status » StepA COMPLETED WITH SKIPS StepC * StepB Copyright © BreizhJug
  • 101.
    Gestion du flow • « exit status » + StepExecutionListener Copyright © BreizhJug
  • 102.
    Gestion du flow • Configuration Copyright © BreizhJug
  • 103.
    Gestion du flow • « exit status » + JobExecutionDecider Copyright © BreizhJug
  • 104.
    Gestion du flow • Configuration Copyright © BreizhJug
  • 105.
    Gestion du flow • Alors « StepExecutionListener » ou « JobExecutionDecider » ? – Le exit status du step est stocké comme meta data – Pas de « latebinding » avec le JobExecutionDecider Copyright © BreizhJug
  • 106.
    Gestion du flow • Encore plus de contrôle: end, fail Copyright © BreizhJug
  • 107.
    Gestion du flow • Partager des informations entre les steps – À la Spring:beanclassic – A la Spring Batch: « Executioncontext » • 1 pour le Job et 1 par Step • C’est une Map sauvegardé dans les meta data • Attention au volume • Latebindings – #{jobExecutionContext[‘myKey']} Copyright © BreizhJug
  • 108.
    Gestion du flow • Accès à ExecutionContext Copyright © BreizhJug
  • 109.
    Gestion du flow • Configuration Copyright © BreizhJug
  • 110.
    Gestion du flow Step A • Mutualiser les flows Step B Mon Flow Step C Step D Copyright © BreizhJug
  • 111.
    Gestion du flow • Configuration Copyright © BreizhJug
  • 112.
    Gestion du flow • Réutiliser un Job Copyright © BreizhJug
  • 113.
    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
  • 114.
    Scaling http://www.flickr.com/photos/claudiasofia99/2878579560/ Copyright © BreizhJug
  • 115.
    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
  • 116.
    Spring Batch inAction http://www.manning.com/templier Copyright © BreizhJug
  • 117.
    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
  • 118.
  • 119.
    ROTI http://www.flickr.com/photos/34943981@N00/202923614/ Copyright © BreizhJug