<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Spring-Batch on Java &amp; Moi</title><link>https://javaetmoi.com/tags/spring-batch/</link><description>Recent content in Spring-Batch on Java &amp; Moi</description><generator>Hugo</generator><language>fr</language><lastBuildDate>Tue, 23 Jun 2015 19:15:14 +0000</lastBuildDate><atom:link href="https://javaetmoi.com/tags/spring-batch/feed.xml" rel="self" type="application/rss+xml"/><item><title>Personnaliser Spring Batch Admin</title><link>https://javaetmoi.com/2015/06/personnaliser-spring-batch-admin/</link><pubDate>Tue, 23 Jun 2015 19:15:14 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1410</guid><description>&lt;p&gt;&lt;a href="wp-content/uploads/2015/06/spring-batch-admin-screenshot.jpg"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="spring-batch-admin-screenshot"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2015/06/spring-batch-admin-screenshot.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt; Pour rappel, &lt;strong&gt;Spring Batch Admin&lt;/strong&gt; est une &lt;strong&gt;console de supervision des traitements par lots implémentés avec Spring Batch&lt;/strong&gt;. En plus d&amp;rsquo;un &lt;strong&gt;frontal web&lt;/strong&gt;, elle offre une &lt;strong&gt;API JSON&lt;/strong&gt; et expose des métriques via JMX.
Bien que dépendant du projet Spring Batch, Spring Batch Admin dispose de &lt;a href="https://github.com/spring-projects/spring-batch-admin"&gt;son propre repo GitHub&lt;/a&gt; et de son propre cycle de vie. Cet article se base sur la &lt;a href="https://spring.io/blog/2015/01/16/spring-batch-and-spring-batch-admin-releases"&gt;version 2.0.0.M1 sortie en janvier 2015.&lt;/a&gt; Développé en Spring MVC et composé de 3 JARs, Spring Batch Admin peut aussi bien être intégrée dans une application existante que déployée dans son propre WAR.&lt;/p&gt;
&lt;p&gt;Ouvert aux extensions, Spring Batch Admin a tout pour devenir un véritable &lt;strong&gt;serveur de batchs&lt;/strong&gt; : monitoring, chargement et mise à jour à chaud de la configuration des jobs, ordonnancement, exécution de jobs sur réception de fichiers …
En 3 ans, c&amp;rsquo;est la seconde fois que je suis amené à personnaliser Spring Batch Admin. Le manuel de référence fourmille d&amp;rsquo;explications. Ce billet recense quelques informations complémentaires qui, je l&amp;rsquo;espère, pourront vous être utiles :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Transformer Spring Batch Admin en une application auto-exécutable embarquant sa propre base de données et son propre conteneur de servlet&lt;/li&gt;
&lt;li&gt;Personnaliser l’interface d’admin&lt;/li&gt;
&lt;li&gt;Adapter les templates FreeMarker au besoin métier&lt;/li&gt;
&lt;li&gt;Exécuter un job suite à la réception d’un fichier&lt;/li&gt;
&lt;li&gt;Router un message en fonction du résultat de l’exécution d’un job&lt;/li&gt;
&lt;li&gt;Ajouter un contrôleur REST&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="spring-batch-admin-screenshot"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2015/06/spring-batch-admin-screenshot.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Etudes de cas Spring Batch</title><link>https://javaetmoi.com/2015/02/worskshop-etudes-de-cas-spring-batch/</link><pubDate>Mon, 02 Feb 2015 07:16:08 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1304</guid><description>&lt;p&gt;Pour créer vos IHM web en Java, vous n’avez que l’embarras du choix : Vaadin, JSF, GWT, Spring MVC, Tapestry …&lt;/p&gt;
&lt;p&gt;Pour accéder aux données, à chacun ses préférences : Hibernate, JPA 2, iBatis, Spring JDBC, Spring Data …&lt;/p&gt;
&lt;p&gt;En matière de web services, il n’y a qu’à choisir : CXF, JAX-WS, JAX-RS, Spring WS, Restlet …&lt;/p&gt;
&lt;p&gt;Mais pour écrire vos traitements par lot ? java.io ? Soyons fou : commons-io. Pas très sexy …
la JSR-352 Java Batch de JEE 7 ? Optez pour l’original.&lt;/p&gt;
&lt;p&gt;Alors franchissez le pas et venez découvrir Spring Batch au cours d’un workshop basé sur un cas d’utilisation concret.&lt;/p&gt;</description></item><item><title>Elastifiez la base MusicBrainz sur OpenShift</title><link>https://javaetmoi.com/2013/11/musicbrainz-elasticsearch-angularjs-openshift/</link><pubDate>Fri, 15 Nov 2013 19:35:01 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=782</guid><description>&lt;p&gt;Pour les besoins d’un workshop sur Elasticsearch, je me suis amusé à &lt;strong&gt;indexer une encyclopédie musicale&lt;/strong&gt; et à mettre en ligne une petite &lt;strong&gt;application HTML 5&lt;/strong&gt; permettant de réaliser des &lt;strong&gt;recherches&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Comme source de données musicale, j’ai opté pour &lt;strong&gt;&lt;a href="http://musicbrainz.org/" title="MusicBrainz Home"&gt;MusicBrainz&lt;/a&gt;&lt;/strong&gt; qui est une plateforme ouverte collectant des méta-données sur les artistes, leurs albums et leurs chansons puis les mettant à disposition du publique.&lt;/p&gt;
&lt;p&gt;Pour indexer les données depuis une base PostgreSQL, j’ai privilégié &lt;strong&gt;Spring Batch&lt;/strong&gt; au détriment d&amp;rsquo;une river. Pour l’IHM, j’ai adapté un prototype basé sur &lt;strong&gt;AngularJS&lt;/strong&gt;, jQuery et Bootstrap qu’avait réalisé &lt;a href="https://twitter.com/lucianprecup"&gt;Lucian Precup&lt;/a&gt; pour la &lt;a href="http://agenda2013.scrumday.fr/event/149"&gt;Scrum Day 2013&lt;/a&gt;. La mise en ligne de l’index Elasticsearch m’aura permis de tester la plateforme Cloud &lt;strong&gt;OpenShift&lt;/strong&gt; de Redhat.&lt;/p&gt;
&lt;p&gt;Cet article a pour objectif de décrire les différentes étapes qui m’ont été nécessaires pour réaliser ma démo et d’expliquer ce que j’ai librement rendu accessible sur &lt;a href="https://github.com/arey/musicbrainz-elasticsearch/blob/musicbrainz-elasticsearch-1.0.0/src/main/java/com/javaetmoi/core/batch/item/EsDocumentWriter.java"&gt;GitHub&lt;/a&gt; et &lt;a href="http://musicsearch.javaetmoi.com/"&gt;Internet&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="logo-musicbrainz"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2013/11/logo-musicbrainz.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Parallélisation de traitements batchs</title><link>https://javaetmoi.com/2012/12/parallelisation-de-traitements-batchs-spring-batch/</link><pubDate>Sat, 01 Dec 2012 17:54:55 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=368</guid><description>&lt;h2 id="contexte"&gt;Contexte&lt;/h2&gt;
&lt;p&gt;Récemment, j’ai participé au développement d’un batch capable d’indexer dans le moteur de recherche &lt;a href="http://www.elasticsearch.org/"&gt;Elasticsearch&lt;/a&gt; des données provenant d’une &lt;strong&gt;base de données&lt;/strong&gt; tierce. Développé en Java, ce batch s’appuie sur &lt;a href="http://static.springsource.org/spring-batch/"&gt;Spring Batch&lt;/a&gt;, le plus célèbre framework de traitements par lot de l’écosystème Java&lt;br&gt;Plus précisément, ce batch est décomposé en 2 jobs Spring Batch, très proches l’un de l’autre :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;le premier est capable d’initialiser à partir de zéro le moteur de recherche&lt;/li&gt;
&lt;li&gt;et le second traite uniquement les mouvements quotidiens de données.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="problématique"&gt;Problématique&lt;/h2&gt;
&lt;p&gt;Au cours du traitement batch, l’exécution de la requête par Oracle pour préparer son &lt;strong&gt;curseur&lt;/strong&gt; a été identifiée comme l’opération la plus couteuse, loin devant la lecture des enregistrements en &lt;strong&gt;streaming&lt;/strong&gt; à travers le réseau, leur traitement chargé de construire les documents Lucene à indexer ou leur &lt;strong&gt;écriture en mode&lt;/strong&gt; bulk dans ElasticSearch. A titre d’exemple, sur des volumétries de production, la préparation côté serveur Oracle d’une requête SQL ramenant 10 millions d’enregistrement peut mettre jusqu’à 1h30.&lt;/p&gt;
&lt;p&gt;Avec pour objectif que le batch passe &lt;strong&gt;sous le seuil de 2h&lt;/strong&gt; à moindre coût, 2 axes d’optimisations ont été étudiés : diminuer le temps d’exécution par Oracle et diminuer le temps de traitement.&lt;/p&gt;
&lt;h2 id="solutions-étudiées"&gt;Solutions étudiées&lt;/h2&gt;
&lt;p&gt;Les optimisations d’un DBA consistant à utiliser des &lt;strong&gt;tables temporaires&lt;/strong&gt; et des &lt;strong&gt;procédures stockées&lt;/strong&gt; n’ont pas été concluantes : trop peu de gains (10 à 20%) pour une réécriture partielle de notre batch, et avec le risque d’engendrer des régressions.&lt;/p&gt;
&lt;p&gt;Après mesures et calculs, l’utilisation de la &lt;strong&gt;pagination&lt;/strong&gt; sur des plages de 100, de 1 000 ou même de 10 000 enregistrements a également été écartée. Dans notre contexte, cela aurait dégradé les performances. Le choix de rester sur l’utilisation d’un &lt;strong&gt;curseur JDBC&lt;/strong&gt; a été maintenu.&lt;br&gt;A cette occasion, nous avons remarqué que les temps de mise en place d’un curseur Oracle pour préparer 1 millions ou 10 millions d’enregistrements étaient du même ordre de grandeur.&lt;/p&gt;
&lt;p&gt;Utilisant déjà l’une des techniques proposées par Spring Batch pour paralléliser notre traitement batch, pourquoi ne pas refaire appel à ses loyaux services ?&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="Modèle physique de données des tables MASTERPIECE, MUSIC_ALBUM et MOVIE"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2012/11/Parall%C3%A9lisationTraitementsBatch_MPD.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Enterprise Spring Integration Certification Mock Exam</title><link>https://javaetmoi.com/2012/10/enterprise-spring-integration-certification-mock-exam/</link><pubDate>Sat, 27 Oct 2012 17:29:57 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=324</guid><description>&lt;p&gt;Last month, I passed the &lt;a href="http://mylearn.vmware.com/mgrReg/plan.cfm?plan=31113&amp;amp;ui=www_cert"&gt;Enterprise Integration with Spring&lt;/a&gt; exam (EIwS 1.x) with a score of 90%. This test is also known as Certified Enterprise Integration Specialist exam. Before passing this exam, you have to attend &lt;a href="http://mylearn.vmware.com/mgrreg/courses.cfm?ui=www_edu&amp;amp;a=one&amp;amp;id_subject=17833"&gt;Enterprise Integration with Spring training&lt;/a&gt; from SpringSource or a Certified Partner.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt=""
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2012/09/CertifiedSpring_EnterpriseIntegrationSpecialist.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;In my last blog entry, I have published a &lt;a href="http://javaetmoi.com/2012/09/certified-spring-enterprise-integration-specialist-study-notes/"&gt;french study guide / notes&lt;/a&gt; to the exam. Since, I received a few emails asking me some materials in English.&lt;/p&gt;
&lt;p&gt;Opposed to the Spring Core Certification, I didn’t find any mock exams for the . So I decided to create a mock exam like I did in my &lt;a href="http://javaetmoi.com/2012/02/core-spring-3-0-certification-mock-exam/"&gt;Core Spring 3.0 Certification Mock Exam blog entry&lt;/a&gt;. The questions are close to the real Enterprise Integration with Spring exam and I hope will help you in practicing for the test or to test your Spring Integration proficiently. I have tried to keep my exam accurate, based on my real exam-experience.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="Enterprise Spring Integration Certification Mock Exam"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2012/09/CertifiedSpring_EnterpriseIntegrationSpecialist.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Certified Spring Enterprise Integration Specialist Study Notes</title><link>https://javaetmoi.com/2012/09/certified-spring-enterprise-integration-specialist-study-notes/</link><pubDate>Sat, 29 Sep 2012 11:18:22 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=230</guid><description>&lt;p&gt;En l’espace de 8 mois, me voici doté d’une deuxième certification Spring. Après la certification Spring Core dont je vous ai fait écho dans mon tout &lt;a href="http://javaetmoi.com/2012/02/core-spring-3-0-certification-mock-exam/" title="Core Spring 3.0 Certification Mock Exam"&gt;premier billet&lt;/a&gt;, j’ai eu l’opportunité de préparer la certification Spring Integration Specialist.&lt;/p&gt;
&lt;p&gt;&lt;a href="wp-content/uploads/2012/09/CertifiedSpring_EnterpriseIntegrationSpecialist.png"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt=""
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2012/09/CertifiedSpring_EnterpriseIntegrationSpecialist.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt; Comme à l’accoutumée avec les certifications Spring, la &lt;a href="http://www.zenika.com/formation_enterprise_integration_avec_spring.html" title="Formation Enterprise Integration avec Spring"&gt;formation officielle Spring Enterprise Integration&lt;/a&gt; est pré-requise. Elaborée par SpringSource et dispensée par Zenika, cette formation couvre de nombreux sujets basés sur Spring Framework 3 et différents projets du Portfolio Spring :&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="Certified Spring Enterprise Integration Specialist Study Notes"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2012/09/CertifiedSpring_EnterpriseIntegrationSpecialist.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Spring Batch s'auto-nettoie</title><link>https://javaetmoi.com/2012/06/sprint-batch-sauto-nettoie/</link><pubDate>Tue, 26 Jun 2012 18:49:09 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=187</guid><description>&lt;p&gt;Lorsque vous mettez en œuvre &lt;strong&gt;&lt;a href="http://static.springsource.org/spring-batch/" title="Page d&amp;#39;accueil du projet Spring Batch"&gt;Spring Batch&lt;/a&gt;&lt;/strong&gt; pour réaliser des traitements par lots, vous avez le choix d’utiliser &lt;strong&gt;une implémentation de &lt;em&gt;JobRepository&lt;/em&gt;&lt;/strong&gt; soit &lt;strong&gt;en mémoire&lt;/strong&gt; soit &lt;strong&gt;persistante&lt;/strong&gt;. L’avantage de cette dernière est triple :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Conserver un &lt;strong&gt;historique des différentes exécutions&lt;/strong&gt; de vos instances de jobs.&lt;/li&gt;
&lt;li&gt;Pouvoir &lt;strong&gt;suivre en temps réel le déroulement de votre batch&lt;/strong&gt; via, par exemple, l’excellent &lt;a href="http://static.springsource.org/spring-batch-admin/" title="Page d&amp;#39;accueil du projet Spring Batch Admin"&gt;Spring Batch Admin&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Avoir la possibilité de &lt;strong&gt;reprendre un batch&lt;/strong&gt; là où il s’était arrêté en erreur.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;La contrepartie d’utiliser un JobRepository persistant est de devoir faire reposer le batch sur une &lt;strong&gt;base de données&lt;/strong&gt; relationnelles. Le schéma sur lequel s’appuie Spring Bath est composé de &lt;strong&gt;6 tables&lt;/strong&gt;. Leur MPD est disponible dans l’ &lt;a href="http://static.springsource.org/spring-batch/reference/html/metaDataSchema.html" title="Appendix B. Spring Batch Meta-Data Schema"&gt;annexe B. Meta-Data Schema&lt;/a&gt; du &lt;a href="http://static.springsource.org/spring-batch/reference/html/" title="Manuel de référence de Spring Batch au format HTML"&gt;manuel de référence de Spring Batch&lt;/a&gt;. SpringSource faisant bien les choses, les scripts DDL de différentes solutions du marché (ex : MySQL, Oracle, DB2, SQL Server, Postgres, H2 …) sont disponibles dans le package org.springframework.batch.core du JAR spring-batch-core-xxx.jar&lt;br&gt;Qui dit base de données, dit &lt;strong&gt;dimensionnement&lt;/strong&gt; de cette dernière. L’ &lt;strong&gt;espace disque requis&lt;/strong&gt; est alors &lt;strong&gt;fonction&lt;/strong&gt; du &lt;strong&gt;nombre d’exécutions&lt;/strong&gt; estimé, de la &lt;strong&gt;nature des informations contextuelles persistées&lt;/strong&gt; et de la &lt;strong&gt;durée de rétention&lt;/strong&gt; des données. Cette démarche prend tout son sens lorsqu’une instance de base de données est dédiée au schéma de Spring Batch. En faisant quelques hypothèses (ex : sur le taux d’échec) et en mesurant le volume occupé sur plusieurs exécutions des batchs, il est possible de prévoir assez finement l’espace occupé par les données.&lt;/p&gt;
&lt;p&gt;A moins de disposer de ressources infinies ou de n’avoir qu’un seul batch annuel, il est fréquent de fixer une durée de rétention de l’historique. Première option : demander à l’équipe d’exploitation de régulièrement lancer un script SQL de purge. Deuxième option : &lt;strong&gt;utiliser Spring Batch pour purger ses propres données&lt;/strong&gt; !!&lt;/p&gt;</description></item></channel></rss>