Spring Batch Avance

4,706 views

Published on

Pour finir l'année en beauté, le Spring User Groupe FR vous propose de nous retrouver le Mardi 20 Décembre 2011 à 19h00 pour une session sur "Spring Batch Avancé". Lors de la première présentation (http://www.slideshare.net/sugfrance/spring-batch-concepts-de-base), nous avons vu les concepts de base de "Spring Batch".

Lors de cette session nous vous proposons d'aborder les notions avancés de "Spring Batch" en tenant compte de vos suggestions (voir le Google Moderator http://www.google.com/moderator/#16/e=5f36). A la fin de la conférence, nous vous proposerons un quizz afin de gagner quelques exemplaires de "Spring Batch in Action" (A.Cogoluegnes, T. Templier, G. Gregory, O. Bazoud), offerts par la société Ekino (http://www.ekino.com / @3k1n0).

Olivier Bazoud / @obazoud est architecte logiciel chez Ekino (http://www.ekino.com), spécialisé dans les technologies Java/JEE/Spring. Fort de 12 ans d’expérience, Olivier est en charge de l’architecture technique de sites et d'applications web à très fort traffic.

Julien Jakubowski / @jak78 est architecte chez OCTO Technology. Il a 10 ans d'expérience acquise au sein de projets à fort engagement pour des grands comptes, dans des secteurs d'activités variés : banque, assurance, industrie, grande distribution...
Julien accompagne ses clients sur des problématiques d'architecture, d'expertise technique, et de productivité des développements.
Il est également co-fondateur et président du Ch'ti JUG (Java User Group de la région Lilloise), qui rassemble tous les mois plus de 100 passionnés de technologies Java.

Spring Batch Avance

  1. 1. SUGF Spring User Group France Spring Batch Avancé Mardi 20 Décembre 2011 Olivier Bazoud Julien Jakubowski
  2. 2. SUGF Intervenants Olivier Bazoud @obazoud, Ekino @3k1n0 ISEN (Toulon) Architecte technique Java EE / Spring, Spring Batch, NoSQL, Node.js Co-auteur de « Spring Batch in Action » Spring User Group France Julien Jakubowski, @jak78, OCTO Technology ISEN (le vrai, de Lille) Architecte technique Spécialisé Java EE / Spring Chti JUG, Agile Tour Lille
  3. 3. SUGF De quoi va-t-on parler ce soir ? • On va parler de batchs en Java • des techniques avancés • … et aussi (un peu) de bière http://www.flickr.com/photos/fromeyetopixel/2559391584/
  4. 4. SUGF Nos objectifs En sortant de la salle, vous savez:  Identifier certains problèmes récurrents avec les batchs écrits en Java  Si Spring Batch est utile pour vous (ou pas)  Intégrer les notions principales  Intégrer les notions avancées  Faire un batch « Spring Batch » dès demain
  5. 5. SUGF Ce qui vous attend • Rappel de l’épisode précédent • Notions avancées – Vote • Questions / Réponses
  6. 6. SUGF Concepts de base Rappel de l’épisode précédent (?)
  7. 7. SUGF Batch : de quoi parle-t-on ? Batch processing = répétition de traitements sur un ensemble de données…
  8. 8. SUGF Batch : de quoi parle-t-on ? … potentiellement grands volumes… http://www.flickr.com/photos/claudiasofia99/2878579560/
  9. 9. SUGF Batch : de quoi parle-t-on ? … sans intervention d’un utilisateur humain – pas d’interface homme-machine
  10. 10. SUGF Batch : de quoi parle-t-on ? Exemples: • Import flat / XML dans une base de données • Mise à jour de données de référentiel • Intégration de flux financiers dans un SI
  11. 11. SUGF Batch : de quoi parle-t-on ? Un batch n’est pas un scheduler • Cron, inotify, Quartz, $U… • Mais un scheduler peut le lancer
  12. 12. SUGF Problèmes récurrents • Fiabilité
  13. 13. SUGF Problèmes récurrents • Maintenabilité
  14. 14. SUGF Problèmes récurrents • Réinvention de la roue… carrée
  15. 15. SUGF Quand j’écris un batch Je suis… à poil, non ? http://www.flickr.com/photos/crystaljingsr/3914729343/sizes/o/in/set-72157622354789320/
  16. 16. SUGF Solution Spring Batch offre pourtant une solution pour vous guider lors de l’écriture de vos batchs en Java
  17. 17. SUGF Spring Batch Notions de base
  18. 18. SUGF Exemple d’un batch InitialStep InitialTasklet RecipeStep Chunk oriented tasklet ItemReader ItemProcessor ItemWriter
  19. 19. SUGF Tasklet • Besoin – Effectuer une tâche unitaire • Exemples – Unzip d’un fichier – Appel d’une procédure stockée – Appel d’un web service
  20. 20. SUGF ItemReader • Besoin – Lire le XML de recettes au format BeerXML • ItemReader – Fournit des items en entrée <xml> SELECT ... FROM ... 123;AB; 456;CD;
  21. 21. SUGF ItemProcessor • Besoin – Transforme, valide et / ou filtre une recette • ItemProcessor – Transforme un item en un autre – Filtrer ou rejeter un item – Emplacement pour les « règles métier »
  22. 22. SUGF ItemWriter • Besoin – Décharge les bières dans une base SQL • ItemWriter – Ecrit les items <xml> INSERT... INTO ... 123;AB; 456;CD;
  23. 23. SUGF Chunk • Besoin – Lire, transformer et écrire • Chunk 1. Lire et transformer les données successivement 2. Ecrire le lot de données – Le commit-interval définit la taille du lot – Gestion de la transaction : Commit/Rollback
  24. 24. SUGF Chunk
  25. 25. SUGF Job • Besoin – Décrire les étapes du batch – Composé d’un ou plusieurs Steps Spring Tools Suite
  26. 26. SUGF Exemple d’un batch InitialStep InitialTasklet RecipeStep Chunk oriented tasklet ItemReader ItemProcessor ItemWriter
  27. 27. SUGF Tests • Tests unitaires facilités via le découpage Spring Batch – writers, processors etc... • Tests dintégration facilités par Spring – @RunWith – Step, Job
  28. 28. SUGF Forces et faiblesses ✔Fiabilité et bons patterns ✔Tests unitaires et dintégration, TDD ✔...the Spring way, intégration à Spring ✔Batchs complexes mieux maintenables ✔Bénéficie de fonctions avancées à moindre coût ✔Productivité, à terme... ✗… après avoir payé le ticket dentrée
  29. 29. Des questions,SUGF avant la suite ? http://www.flickr.com/photos/crystaljingsr/3914729343/in/set-72157622354789320/
  30. 30. SUGF Spring Batch Allons plus loin
  31. 31. RecipeSUGF Maître détail Hop Hop Hop R;Burton Ale;All Grain;Brad Smith H;Goldings, East Kent;United Kingdom H;Northern Brewer;Germany H;Fuggles;United Kingdom END R;Dry Stout;All Grain;Brad Smith H;Fuggles;United Kingdom END
  32. 32. SUGF Un batch plus robuste reprise sur erreurs
  33. 33. SUGF Flow Step A Step B
  34. 34. SUGF Spring Batch Admin
  35. 35. SUGF Scaling et parallélisme http://www.flickr.com/photos/claudiasofia99/2878579560/
  36. 36. SUGF Spring Batch et Hibernate
  37. 37. SUGF Allons plus loin… • Un cas un peu plus complexe – maître / détail • La reprise sur erreurs • Un flow qui n’est pas de bisounours… • Spring Batch Admin (et Monitoring) • Scaling et parallélisme • Spring Batch et Hibernate
  38. 38. RecipeSUGF Maître détail Hop Hop Hop R;Burton Ale;All Grain;Brad Smith H;Goldings, East Kent;United Kingdom H;Northern Brewer;Germany H;Fuggles;United Kingdom END R;Dry Stout;All Grain;Brad Smith H;Fuggles;United Kingdom END …
  39. 39. Maître détailSUGF Déclaration du reader custom
  40. 40. SUGF R;Burton Ale;All Grain;Brad Smith H;Goldings, East Kent;United Kingdom H;Northern Brewer;Germany H;Fuggles;United Kingdom END R;Dry Stout;All Grain;Brad Smith H;Fuggles;United Kingdom END
  41. 41. Maître détailSUGF Déclaration du reader délégué
  42. 42. SUGF A retenir • Implémentation de notre propre reader – Ré-utilisation d’un reader déjà fourni par Spring Batch – Ré-utilisation de ce que nous avons déjà codé précédemment ou • Spring Batch pense à vous  – PatternMatchingCompositeLineTokenizer
  43. 43. SUGF Un batch plus robuste
  44. 44. SUGF Reprise sur erreur • Un batch plus robuste (tolérant à l’erreur) c’est un batch : – Qui survit à quelques données invalides – Qui survit à une indisponibilité – Qu’on est en mesure de relancer
  45. 45. SUGF Reprise sur erreur • Spring Batch out-of-the-box propose: – Sauter les erreurs non bloquantes (skip) – Recommencer un traitement (retry) – Déterminer si le batch est fini (completion) – Redémarrer un batch (restart)
  46. 46. SUGF Reprise sur erreur
  47. 47. SUGF Reprise sur erreur: Skip 0001;ABC;DEF; 0002;ABC;DEF; 000zxjgxdjghjsdfkud 0004;ABC;DEF; • Ne pas arrêter le batch si la lecture/process/écriture échoue • Personnaliser les cas de « skip » • Ecouter les cas de « skip »
  48. 48. SUGF Reprise sur erreur: Skip – Si FlatFileException, Spring Batch skip l’item – Skip de 10 items max – Au-delà la step « failed » – Include/Exclude possible
  49. 49. SUGF Reprise sur erreur: Skip • Personnaliser la gestion du « skip » • Par défaut: LimitCheckingItemSkipPolicy
  50. 50. SUGF Reprise sur erreur: Skip • Configuration de la gestion du « skip »
  51. 51. SUGF Reprise sur erreur: Skip • Un listener permet de traiter les items écartés • Les annotations existent aussi – @OnSkipInRead – @OnSkipInWrite – @OnSkipInProcess
  52. 52. SUGF Reprise sur erreur: Retry
  53. 53. SUGF Reprise sur erreur: Retry • Permet de relancer une opération si indispo temporaire • Personnaliser les cas de « retry » • Ecouter les cas de « retry »
  54. 54. SUGF Reprise sur erreur: Retry – Si DLDAE, Spring Batch recommence – Retry 3 fois max – Au-delà la step « failed » – Includes/Excludes possible
  55. 55. SUGF Reprise sur erreur: Retry • Personnaliser le « retry »: RetryPolicy – SimpleRetryPolicy (défaut) • Stratégie entre 2 « retry »: BackoffPolicy – NoBackOffPolicy (défaut) – ExponentialBackOffPolicy vraiment utile
  56. 56. SUGF Reprise sur erreur: Retry • Configuration de la gestion du « retry »
  57. 57. SUGF Reprise sur erreur: Retry • Un listener permet de traiter les « retry »
  58. 58. SUGF Reprise sur erreur: Retry • Pour les tasklets – RetryTemplate – RetryOperationsInterceptor avec de l’AOP
  59. 59. SUGF Reprise sur erreur: Restart
  60. 60. SUGF Reprise sur erreur: Restart • Même avec skip/retry, un batch peut planter • Il reste encore une solution  • Nous pouvons redémarrer le batch
  61. 61. SUGF Reprise sur erreur: Restart • Indique si le job est « restartable » • Indique le nombre max de « restart »
  62. 62. SUGF Reprise sur erreur: Restart • La step est démarrée lors du restart même si elle a été terminée correctement
  63. 63. SUGF Reprise sur erreur: Restart • Comment reprendre en plein milieu d’un chunk ? • Comment Spring Batch sait il où reprend ?
  64. 64. SUGF Reprise sur erreur: Restart • Spring batch stocke des méta data
  65. 65. SUGF Reprise sur erreur: Restart • Spring Batch persiste régulièrement les « ExecutionContext » • Ceci permet à Spring Batch de savoir où reprendre • C’est ce qui fait qu’un batch est « restartable »
  66. 66. SUGF Reprise sur erreur: Restart • Si vous voulez que vos Reader/Writer custom soient restartables, vous devez les concevoir restartables! • Certains fournis par Spring Batch le sont, mais pas tous • Ce n’est pas toujours possible – ex: Writer JMS.
  67. 67. SUGF Reprise sur erreur: Restart • ItemStream
  68. 68. SUGF Reprise sur erreur: Restart • Exemple de Reader « restartable »
  69. 69. SUGF Reprise sur erreur Conclusion • Nous avons appris comment: – Ecarter des items défectueux (skip) – Recommencer une step s’il y a une erreur temporaire (retry) – Implémenter notre propre stratégie de « skip » et « retry » – Redémarrer un job avec certains steps
  70. 70. SUGF Gestion du flow
  71. 71. SUGF Gestion du flow Le « batch bisounours » Step A Step B
  72. 72. SUGF Gestion du flow Exemple
  73. 73. SUGF Gestion du flow Exemple
  74. 74. SUGF Gestion du flow • Le « batch complexe» Step Step Step Step Step Step Step Step Step
  75. 75. SUGF Gestion du flow • Comment… – faire des flows non linéaires – piloter l’enchaînement des steps – passer des données entre steps
  76. 76. SUGF Gestion du flow • Exemple plus simple ;) StepA FAILED StepAlert * StepB
  77. 77. SUGF Gestion du flow
  78. 78. SUGF Gestion du flow • Batch Status – Etat du job / step en cours d’exécution • Exit Status – Etat du job ou step après son exécution – C’est lui qui détermine le flow • Exemple – COMPLETED, STARTING, STARTED, STOPPING, STOPPED, FAILED,ABANDONED or UNKNOWN – C?T (CAT mais pas COUNT), C*T (CAT et COUNT)
  79. 79. SUGF Gestion du flow • Créer et utiliser ses propres « exit status » – StepExecutionListener – JobDecider
  80. 80. SUGF Gestion du flow • Utiliser ses propres « exit status » StepA COMPLETED WITH SKIPS StepC * StepB
  81. 81. SUGF Gestion du flow • « exit status » + StepExecutionListener
  82. 82. SUGF Gestion du flow • Configuration
  83. 83. SUGF Gestion du flow • « exit status » + JobExecutionDecider
  84. 84. SUGF Gestion du flow • Configuration
  85. 85. SUGF Gestion du flow • « StepExecutionListener » ou « JobExecutionDecider » ? • JobExecutionDecider pour réutiliser plus facilement la logique de branchement
  86. 86. SUGF Gestion du flow • Encore plus de contrôle: end, fail
  87. 87. SUGF Gestion du flow • Partager des informations entre les steps – À la Spring:bean classic – A la Spring Batch: « Execution context » • 1 pour le Job et 1 par Step • C’est une Map sauvegardé dans les meta data • Attention au volume • Late bindings – #{jobExecutionContext[‘myKey]}
  88. 88. SUGF Gestion du flow • Accès à ExecutionContext
  89. 89. SUGF Gestion du flow • Configuration
  90. 90. SUGF Gestion du flow Step A • Mutualiser les flows Step B Mon Flow Step C Step D
  91. 91. SUGF Gestion du flow • Configuration
  92. 92. SUGF Gestion du flow • Réutiliser un Job
  93. 93. SUGF Gestion du flow • Conclusion, nous avons – Fait des flows non linéaires – Piloté l’enchaînement des steps – Passé des données entre steps – Mutualisé et réutilisé des jobs
  94. 94. SUGF Spring Batch Admin • Console Web pour Spring Batch – « Standalone » ou « Embedded » – API Rest – Uploader une nouvelle configuration – Uploader un fichier à traiter • « Customisable » – Base de données, Branding, UI, .. • Monitorer les batchs
  95. 95. SUGF Spring Batch Admin • API REST
  96. 96. SUGF Spring Batch Admin $ curl –s http://localhost:8080/spring-batch-admin-sample/jobs.json { "jobs": { "resource": "http://localhost:8080/spring-batch-admin-sample/jobs.json", "registrations": { "infinite": { "name": "infinite", "resource": "http://localhost:8080/spring-batch-admin-sample/jobs/infinite.json", "description": "No description", "executionCount": 0, "launchable": true, "incrementable": false }, "job1": { "name": "job1", "resource": "http://localhost:8080/spring-batch-admin-sample/jobs/job1.json", "description": "No description", "executionCount": 0, "launchable": true, "incrementable": true …
  97. 97. SUGF Spring Batch Admin • Les jobs
  98. 98. SUGF Spring Batch Admin • Lancement / Historique d’un job
  99. 99. SUGF Spring Batch Admin • Lancer un job
  100. 100. SUGF Spring Batch Admin • Détail d’un job execution
  101. 101. SUGF Spring Batch Admin • Détail d’éxécution
  102. 102. SUGF Spring Batch Admin / Monitoring • JMX / MBean – BatchMBeanExporter • Exporter un jobService • Voir les métriques des « Job/Steps Executions » – SLA StepExecutionServiceLevelMonitor • Permet de recevoir des notifications JMX si une Step met trop de temps • Utilisable aussi en Standalone
  103. 103. SUGF Spring Batch Admin / Monitoring
  104. 104. SUGF Spring Batch Admin / Monitoring
  105. 105. SUGF Spring Batch Admin • Conclusion, nous avons aborder – Les principaux écrans de « Spring Batch Admin » – L’API Rest – Le monitoring par JMX
  106. 106. SUGF Scaling http://www.flickr.com/photos/claudiasofia99/2878579560/
  107. 107. SUGF Scaling
  108. 108. SUGF Scaling • Différentes stratégies possibles – Multi-threaded Step (single process) – Parallel Steps (single process) – Remote Chunking of Step (multi process) – Partitioning a Step (single or multi process)
  109. 109. SUGF Scaling • Multi-threaded Step – Une Step est multi threaded • Parallel Steps – Les Steps sont exécutées en parallèle • Remote Chunking of Step – Distribution des chunks • Partitioning a Step – Partage les données à travers les noeuds
  110. 110. SUGF Scaling: Multi-threaded Step – Multi thread au niveau « Step » – Utilise un ThreadPoolTaskExecutor – Chaque thread construit un chunk – Les readers/writers sont thread-safe ? • La plus part non! ils sont stateful – « Process Indicator Pattern » • Lire les items ‘processed’ = false • Un ItemProcessor met ‘processed = true’
  111. 111. SUGF Scaling: Multi-threaded Step
  112. 112. SUGF Scaling: Step en parallèle • Executer plusieurs Step en parallèle • Mot clé « split » dans la configuration • Possibilité utiliser un ThreadPoolTaskExecutor
  113. 113. SUGF Scaling: Step en parallèle
  114. 114. SUGF Scaling: Remote Chunking • Répartition de la charge vers des slaves – Lecture sur le Master – Processor et Writer sur les slaves • Spring Batch propose des interfaces/classes • Spring Integration propose une implementation • La relation master/slave : MOM – ActiveMQ, RabbitMQ, …
  115. 115. SUGF Scaling: Remote Chunking Master Chunk Processor Reader Chunk Provider Slave 1 Slave 2 Slave N Chunk Writer Chunk Writer Chunk Writer Processor Processor Processor
  116. 116. SUGF Scaling: Remote Chunking • Démo ?!
  117. 117. SUGF Scaling: Partitioning • Répartir les données suivant une clé de partition – « Partitionner » • Traiter les données – « PartitionHandler » • Et vous pouvez combiner les techniques précédentes
  118. 118. SUGF Scaling: Partitioning
  119. 119. SUGF Scaling • Conclusion, nous avons aborder – Les stratégies possibles – La démo « Remote Chunking of Step »
  120. 120. SUGF Spring Batch et Hibernate
  121. 121. SUGF Spring Batch et Hibernate • Les raisons – code existant – rapidité de développement (les premiers 80%) • Ca ne se fait pas sans dangers…
  122. 122. SUGF Spring Batch et Hibernate • Votre mapping Hibernate est il fait pour du batch ? – Ai-je besoin de tous les fetchs ?! – Select N+1 ?! • Overhead de Hibernate sur JDBC
  123. 123. SUGF Spring Batch et Hibernate • Hibernate est stateful (par défaut) – 1M d’items lus = 1M en RAM  OutOfMemoryError • Utiliser HibernateCursorItemReader – 1 requête HQL – Session stateless
  124. 124. SUGF Spring Batch et Hibernate • Pattern: « Driving Query Based ItemReaders » • Certaines bases de données (ex: DB2) – Pessimitic looking – Ouverture de curseurs sur des données importantes • Bonne pratique avec Hibernate • Prévient les LazyException
  125. 125. SUGF Spring Batch et Hibernate • Principe – L’ItemReader lit les « id » via SQL • Select id from XXX where … – Le premier ItemProcessor transforme l’id en objet via Hibernate par exemple – Les autres processors font les traitements métiers –…
  126. 126. SUGF Questions ? http://www.flickr.com/photos/crystaljingsr/3914729343/in/set-72157622354789320/
  127. 127. SUGF Quizz
  128. 128. SUGF Spring Batch in Action http://www.manning.com/templier
  129. 129. SUGF Ekino / @3k1n0 • Conception, développement et maintenance de dispositifs digitaux • 150 personnes – 50% de développeurs, 0% de régie • Digital – Mobile + HTML + RIA – JAVA + PHP + .NET • 6 pôles de compétences, 25 clients, 50 projets/an = 1 équipe
  130. 130. SUGF Quizz 1 Ce que nest pas Spring Batch ? 1. un framework orienté batchs 2. un scheduler 3. un framework open source
  131. 131. SUGF Quizz 2 Qui est le principal leader du projet Spring Batch ? 1. Antonio Goncalves 2. Obi-wan Kenobi 3. Dave Syer
  132. 132. SUGF Quizz 3 Comment sappelle la console d’admin de Spring Batch ? 1. Coldfusion Web Console 2. Spring Batch Admin 3. PlayScalaInCloud
  133. 133. SUGF Quizz 4 Quel est l’objet qui n’existe pas en « Spring Batch » ? 1. ItemReader 2. ItemWriter 3. ItemBien
  134. 134. SUGF Quizz 5 Qui vous offre un exemplaire de « Spring Batch in Action »? 1. Sais pas, je viens de me réveiller 2. Ekino 3. Le père Noël
  135. 135. SUGF Liens • Spring User Group Paris – http://groups.google.fr/group/sugfr • Le code de la présentation – https://github.com/obazoud/spring-batch-sug • Spring Batch 2.1.x – http://static.springsource.org/spring-batch • Articles sur le web – http://www.theserverside.com/news/1363855/Spring-Batch-Overview – http://www.infoq.com/presentations/syer-introducing-spring-batch – http://blog.zenika.com/index.php?post/2010/03/05/To-batch-or-not-to- batch – http://blog.octo.com/spring-batch-par-quel-bout-le-prendre/
  136. 136. SUGF ROTI http://www.flickr.com/photos/34943981@N00/202923614/
  137. 137. SUGF Session « Spring Batch Avancé» • Ekino – http://www.ekino.com / @3k1n0 – Olivier Bazoud / @obazoud • Octo Technology – http://www.octo.com / @ OCTOTechnology – Julien Jakubowski / @jak78

×