SlideShare uma empresa Scribd logo
1 de 25
Workshop Spring - Session 4 
Retour d’expérience 
Mise en oeuvre de Spring Batch 
Diffusé en janvier 2012 
Réactualisé en décembre 2014
Sommaire 
Introduction 3 
Présentation de l’étude de cas 4 
Objectifs 7 
Mise en oeuvre 8 
Pour aller plus loin 23 
Conclusion 24 
2 
Retour d’Expérience sur la mise en oeuvre de Spring Batch
Introduction 
• Qu’est-ce qu’un Batch ? 
• Suite de traitements sur un ensemble de données 
• sans intervention humaine 
• Java et les batchs 
• Spring Batch 
• Standardisation JSR-352 Batch Applications dans JEE 7 
– Implémentation de référence : https://java.net/projects/jbatch/ 
• Aucune alternative aussi aboutie 
• Objectifs 
• Aperçu concret de sa Mise en oeuvre 
• Intégrer les fondamentaux 
• Avoir une vue d’ensemble de Ses fonctionnalités 
• L’utiliser demain 
3 
Workshop sur les batchs en java
Présentation de l’étude de cas 
4 
Périmètre fonctionnel 
• Commandes réalisées depuis une application Web 
et stockées en base de données 
• Tous les soirs, un traitement batch émet un fichiers 
client et un fichier de facturation vers un Back 
Office Mainframe 
• Les commandes traitées sont marquées comme tel
Présentation de l’étude de cas 
• Projet métier 
• Retarder l’exécution de 2 batchs quotidiens 
• Export de données au Mainframe réalisé à chaud 
• Batchs iso-fonctionnels 
• Recette complète par la MOA 
• Opportunités 
• Montée de version de framework : Spring et Hibernate 
• Migration d’un framework de batch maison à Spring Batch 2.1 
• Déploiement automatisé des batchs 
• Fiabiliser l’exécution des batchs 
Gestion des erreurs et des codes retours 
• Améliorer la gestion des logs 
• Bénéficier de reporting 
5 
Origine du projet de migration
Présentation de l’étude de cas 
1. Récupère les identifiants des commandes à exporter 
2. Charge les commandes à partir de leurs identifiants 
3. Itère sur la liste des commandes 
1. Génère les factures et identifie les clients 
2. Construit les enregistrements CICS des factures et des clients 
3. Incrémente les compteurs 
4. Construit les enregistrements header et footer 
5. Ecrit les enregistrements dans 2 fichiers temporaires 
6. Met à jour en base de données un flag d’émission 
7. Renomme les fichiers temporaires afin qu’ils soient pris en compte par le 
système de transfert de fichier 
6 
Batchs existants décomposés en 7 étapes
Objectifs 
• Migration technique 
• Mêmes données en entrée 
• Mêmes fichiers en sortie 
• Evolutions techniques 
• Tests de non régressions 
– Tests de bout en bout basés sur : 
• Un échantillonnage de données de production 
• Des fichiers générés à partir du batch existant 
• Des outils : H2, Maven et JUnit 
• Tests selenium 
• Saisie et émission de commandes 
• Exécutés automatiquement avant, pendant et après le batch 
7 
Des batchs iso-fonctionnels
Mise en oeuvre 
8 
Décomposition des batchs en une seule étape 
Base 
MySql 
avec 
Commandes 
Alerte par mail 
Erreur 
Lecture Ecriture 
Fichier de facturation 
Fichier des clients 
Traitement 
Construction 
Enregistrements 
CICS 
Une étape décomposée en 3 phases
Spring Batch 
9 
Vocable 
Job 
Step 
Chunk Tasklet 
ItemReader ItemProcessor ItemWriter 
s 
Base 
G@el
Spring Batch 
10 
Diagramme de séquence de traitement d’un chunk 
TaskletStep ItemReader ItemProcessor ItemWriter 
read 
item 
transform(items) 
transformedItems 
write(transformedItems) 
Chaque chunk 
s’exécute dans sa 
propre transaction 
Les items sont lus un à 
un ou en bloc 
La phase de 
traitement est 
optionnelle 
Le lot de données à traiter peut être morcelé en chunk 
Point de sauvegarde 
avant le commit
Mise en oeuvre 
11 
Configuration d’un Job et d’un Step 
<!-- Job Spring Batch chargé d'exécuter le batch JM076--> 
<batch:job id="batchJM076Job" restartable="false"> 
<batch:step id="processCarOrderStep" 
parent="processOrderStep" /> 
</batch:job> 
Permet de mutualiser le step entre 2 batchs 
<!– Etape chargée d'émettre des commandes--> 
<batch:step id="processOrderStep" abstract="true"> 
<batch:tasklet transaction-manager="transactionManager"> 
<batch:chunk reader="orderReader" 
processor="orderProcessor" 
writer="billingAndCustomerWriter" 
… /> 
</batch:tasklet> 
… 
</batch:step> 
Référence 3 
beans Spring 
Batch transactionnel
Mise en oeuvre 
12 
Reader Hibernate 
Initialement décomposé en un bean parent générique et un bean 
spécifique au batch JM076 
<!-- Reader Spring Batch chargé de récupérer les commandes 
à traiter depuis la base de données via Hibernate --> 
<bean id="orderReader" 
class="org.sf.batch.item.database.HibernateCursorItemReader" 
p:sessionFactory-ref="sessionFactory" 
p:useStatelessSession="false"> 
<property name="queryString" 
value="FROM Order order 
WHERE order.sentItemFlag is null 
ORDER BY id" /> 
</bean> 
Session Hibernate nécessaire 
pour le Lazy-loading 
Requête HQL de sélection des 
commandes à émettre
Spring Batch 
13 
Quelques implémentations de Reader disponibles 
public interface ItemReader<T> { 
T read() throws Exception, UnexpectedInputException, 
ParseException; 
} 
Classes Propriétés 
StoredProcedureItemReader Nom de la procédure stockée, paramètres, 
row mapper 
JdbcPagingItemReader Taille d’une page, fournisseur de requêtes 
SQL pagninées, paramètres 
FlatFileItemReader Encodage, ressource à lire, lignes d’en-tête, 
line mapper, séparateur 
StaxEventItemReader Ressource XML à lire, élément racine, 
unmarshaller 
JmsItemReader Jms template, file JMS à lire
Mise en oeuvre 
14 
Déclaration et implémentation d’un Item Processor 
<!-- Traite les commandes fin d'émettre les factures --> 
<bean id="orderProcessor" 
class="com.javaetmoi.batch.jm076.CarOrderProcessor" 
scope="step" 
p:billingCounter-ref="billingCounter" 
p:customerCounter-ref=« customerCounter" /> 
public class CarOrderProcessor implements 
ItemProcessor<Order, ProcessResultHolder> { 
public ProcessResultHolder process(Order order) 
throws BatchException { 
// … Création des factures et identification des clients 
return processResultHolder; 
} … 
}
Mise en oeuvre 
15 
Configuration des writers (1/2) 
<!-- Writer composite Spring batch chargé de générer 2 fichiers 
pour le back office et de mettre à jour la base MySql--> 
<bean id="billingAndCustomerWriter" 
class="org.sf.batch.item.support.CompositeItemWriter"> 
<property name="delegates"> 
<list> 
<!-- Fichier des factures --> 
<ref bean=« billingWriter" /> 
<!-- Fichier des clients --> 
<ref bean="customerWriter" /> 
<!– Mis à jour indicateur de transmission dans la table 
des commandes --> 
<ref bean="orderFlagWriter" /> 
</list> 
</property> 
</bean> 
Writers délégués appelés 
séquentiellement dans 
l’ordre déclaré
Spring Batch 
16 
Quelques implémentations de writers disponibles 
public interface ListItemWriter<T> { 
void write(List<? extends T> items) throws Exception; 
} 
Classes Propriétés 
HibernateItemWriter Template Hibernate 
JdbcBatchItemWriter Requête SQL, callback method chargé de 
setter les paramètres 
FlatFileItemWriter Encodage, fichier plat, séparateur de ligne, 
callbacks d’en-ête et de fin de fichier 
StaxEventItemWriter Fichier XML, élément racine, marshaller, 
callbacks d’en-ête et de fin de fichier 
SimpleMailMessageItemWriter Implémentation de MailSenders
Mise en oeuvre 
17 
Configuration des writers (2/2) 
<!-- Writer Spring batch chargé d'écrire le fichier des factures --> 
<bean id="billingWriter" 
class="com.javaetmoi.core.batch.writer.ExtendedFlatFileItemWriter" 
p:lineSeparator="" p:encoding="ISO-8859-1" 
p:shouldDeleteIfError="true" /> 
<property name="lineAggregator"> 
<bean class="com.javaetmoi…common.item.BillingLineAggregator"/> 
</property> 
<property name="resource" value="file:${batch.data.out.path} 
/billing-jm076.dat"/> 
<property name="footerCallback" ref="billingFooterCallback" /> 
</bean> 
<!-- Met à jour le flag des factures envoyées au back office --> 
<bean id="billingFlagWriter" 
class="com.javaetmoi…common.item.GenericFlagWriter" 
p:processOrderToExport-ref="processOrderToExport" /> 
<bean id=" processOrderToExport " 
class="fr…batch.commun.services.ProcessOrdertoExport" 
p:orderDao-ref="orderDao" />
Mise en oeuvre 
• Besoin 
• Une seule et unique transaction pour tout le batch 
• Les erreurs fonctionnelles ne doivent pas faire échouer le batch 
• Fichiers générés : tout ou rien 
• Comportement proposé par Spring Batch 
• Une transaction par chunk 
• Configuration des exceptions n’annulant pas la transaction 
• Les writers sur filesystem peuvent participer au contexte transactionnel 
• Solutions 
• Intervalle de commit réglé à l’infini pour avoir un unique chunk 
• Les exceptions de type BatchException ne provoquent pas de rollback 
• Les writers des factues et des clients sont enregistrés au Stream 
• Restauration en mémoire des compteurs assurée par un listener 
18 
Gestion des transactions (1/2)
Mise en oeuvre 
19 
Gestion des transactions (2/2) 
<batch:tasklet transaction-manager="transactionManager" …> 
<batch:chunk … commit-interval="2147483647" …> 
<batch:streams> 
<batch:stream ref="billingWriter" /> 
<batch:stream ref="customerWriter" /> 
</batch:streams> 
… 
</batch:chunk> 
<batch:no-rollback-exception-classes> 
<batch:include 
class="com…common.exception.BatchException" /> 
</batch:no-rollback-exception-classes> 
… 
<batch:listeners> 
<batch:listener ref="orderProcessListener" /> 
… 
</batch:listeners> 
</batch:tasklet>
Mise en oeuvre 
• Besoin 
• Erreur de traitement d’une commande non bloquante 
• Enregistrée dans les pistes d’audit 
• Être alerté par mail 
• Solutions 
• Les erreurs fonctionnelles signalées par des exceptions spécifiques 
ne doivent pas faire échouer le traitement 
– Non vérifiées, les BatchException sont levées lors de la génération des 
enregistrements 
– Paramétrable dans le chunk : skip-limit et skippable-exception-classes 
• Traces générées lorsqu’une exception est levée 
– Méthode onProcessError() de l’interface ItemProcessListener 
• Envoi de mail sur génération d’une trace de niveau >= à warning 
– Implémentation avec Logback : SMTPAppender, OnEventEvaluator, 
HTMLLayout 
20 
Gestion des erreurs (1/2)
21 
Mise en oeuvre 
<batch:tasklet …> 
<batch:chunk … skip-limit="2147483647" …> 
… 
<batch:skippable-exception-classes> 
<batch:include 
class="com…common.exception.BatchException" /> 
</batch:skippable-exception-classes> 
</batch:chunk> 
… 
</batch:tasklet> 
public void onProcessError(Order order, Exception ex) { 
LOGGER.error("Une erreur est survenue lors du 
traitement de la commande n°{}: {}", 
order.getNumber(), ex.getMessage()); 
} 
Gestion des erreurs (2/2)
Mise en oeuvre 
• Exécution possible en ligne de commande ou par 
programmation 
• Ordonnanceur : Quartz, $U, CRON, planificateur de tâches Windows … 
• Tests Junit et TestNG 
• JMX, Interface graphique, ServIces web … 
• Contexte projet : 
• Ordonnanceur Dollar Universe 
• Packagés dans un JAR 
– Extrait du MANIFEST.MF de myapp-batch-2.0.1.jar : 
– Main-Class: 
org.springframework.batch.core.launch.support.CommandLineJobRunner 
Class-Path: ./ojdbc-10.2.0.3-jdk14.jar ./spring-batch-core-3.0.2.RELEASE.jar … 
• En Ligne de commande 
– java -jar myapp-batch-2.0.1.jar  
com/javaetmoi/myapp/batch/applicationContext-batch-jm076.xml 
batchJM076Job 
22 
Exécution du batch
Pour aller plus loin 
• Console d’administration et de suivi 
• Spring batch Admin 
• Reprise sur erreur 
• Réexécution d’une instance de job 
• Persistance du contexte 
• Exécution dynamique 
• Enchaînement conditionnels d’étapes 
• Paramètres d’entrée évalués dynamiquement 
• Scalabilité et Parallélisme 
• Exécution de chunk et de step en parallèle 
• Sur la même machine ou de manière distribuée 
• Partionnement des données 
23 
Fonctionnalités non présentées
Conclusion 
• Code technique supprimé 
• Réutilisabilité du code métier 
• Création des enregistrements CICS à partir des commandes 
• Testabilité 
• Tests unitaires existants conservés 
• Tests de bout en bout ajoutés 
• Design Amélioré 
• Découpage mieux structuré 
• Peut-être encore meilleur si développé from scrath 
• Désenttement de l’ancien framework de batchs maison 
• Buggué au niveau du code retour en cas d’erreur 
• Exemple d’utilisation réutilisé pour 2 autres batchs 
• Job Repository persistant non exploité 
• Effort nécessaire pour monter en compétences 
• La connaissance du framework Spring est un pré-requis 
24 
Retours sur la migration vers Spring Batch
Conclusion 
25 
Spring Batch en 3 mots 
Robuste 
• Fiable 
• Gestion des 
erreurs 
• Reprise 
• Tests unitaires 
• Performant 
• Standardisé 
Productif 
• Cadre de 
développement 
• Maintenabilité 
• Code technique 
fourni 
Extensible 
• Ouvert 
• Spring Batch 
Admin 
• Spring 
Intégration

Mais conteúdo relacionado

Mais procurados

Conférence: Catalyseurs de l'Intelligence Artificielle et Écosystème des Fram...
Conférence: Catalyseurs de l'Intelligence Artificielle et Écosystème des Fram...Conférence: Catalyseurs de l'Intelligence Artificielle et Écosystème des Fram...
Conférence: Catalyseurs de l'Intelligence Artificielle et Écosystème des Fram...ENSET, Université Hassan II Casablanca
 
Mohamed youssfi support architectures logicielles distribuées basées sue les ...
Mohamed youssfi support architectures logicielles distribuées basées sue les ...Mohamed youssfi support architectures logicielles distribuées basées sue les ...
Mohamed youssfi support architectures logicielles distribuées basées sue les ...ENSET, Université Hassan II Casablanca
 
Introduction à React JS
Introduction à React JSIntroduction à React JS
Introduction à React JSAbdoulaye Dieng
 
Architecture jee principe de inversion de controle et injection des dependances
Architecture jee principe de inversion de controle et injection des dependancesArchitecture jee principe de inversion de controle et injection des dependances
Architecture jee principe de inversion de controle et injection des dependancesENSET, Université Hassan II Casablanca
 
Initiation à Express js
Initiation à Express jsInitiation à Express js
Initiation à Express jsAbdoulaye Dieng
 

Mais procurados (20)

Conférence: Catalyseurs de l'Intelligence Artificielle et Écosystème des Fram...
Conférence: Catalyseurs de l'Intelligence Artificielle et Écosystème des Fram...Conférence: Catalyseurs de l'Intelligence Artificielle et Écosystème des Fram...
Conférence: Catalyseurs de l'Intelligence Artificielle et Écosystème des Fram...
 
Maven et industrialisation du logiciel
Maven et industrialisation du logicielMaven et industrialisation du logiciel
Maven et industrialisation du logiciel
 
Support de cours technologie et application m.youssfi
Support de cours technologie et application m.youssfiSupport de cours technologie et application m.youssfi
Support de cours technologie et application m.youssfi
 
Support de cours angular
Support de cours angularSupport de cours angular
Support de cours angular
 
Sécurité des Applications Web avec Json Web Token (JWT)
Sécurité des Applications Web avec Json Web Token (JWT)Sécurité des Applications Web avec Json Web Token (JWT)
Sécurité des Applications Web avec Json Web Token (JWT)
 
Support de cours entrepise java beans ejb m.youssfi
Support de cours entrepise java beans ejb m.youssfiSupport de cours entrepise java beans ejb m.youssfi
Support de cours entrepise java beans ejb m.youssfi
 
Mohamed youssfi support architectures logicielles distribuées basées sue les ...
Mohamed youssfi support architectures logicielles distribuées basées sue les ...Mohamed youssfi support architectures logicielles distribuées basées sue les ...
Mohamed youssfi support architectures logicielles distribuées basées sue les ...
 
Support Web Services SOAP et RESTful Mr YOUSSFI
Support Web Services SOAP et RESTful Mr YOUSSFISupport Web Services SOAP et RESTful Mr YOUSSFI
Support Web Services SOAP et RESTful Mr YOUSSFI
 
Introduction à React JS
Introduction à React JSIntroduction à React JS
Introduction à React JS
 
Traitement distribue en BIg Data - KAFKA Broker and Kafka Streams
Traitement distribue en BIg Data - KAFKA Broker and Kafka StreamsTraitement distribue en BIg Data - KAFKA Broker and Kafka Streams
Traitement distribue en BIg Data - KAFKA Broker and Kafka Streams
 
Hibernate jpa
Hibernate jpaHibernate jpa
Hibernate jpa
 
Support distributed computing and caching avec hazelcast
Support distributed computing and caching avec hazelcastSupport distributed computing and caching avec hazelcast
Support distributed computing and caching avec hazelcast
 
Architecture jee principe de inversion de controle et injection des dependances
Architecture jee principe de inversion de controle et injection des dependancesArchitecture jee principe de inversion de controle et injection des dependances
Architecture jee principe de inversion de controle et injection des dependances
 
Introduction à React
Introduction à ReactIntroduction à React
Introduction à React
 
Support JEE Spring Inversion de Controle IOC et Spring MVC
Support JEE Spring Inversion de Controle IOC et Spring MVCSupport JEE Spring Inversion de Controle IOC et Spring MVC
Support JEE Spring Inversion de Controle IOC et Spring MVC
 
Initiation à Express js
Initiation à Express jsInitiation à Express js
Initiation à Express js
 
spring-boot-fr.pdf
spring-boot-fr.pdfspring-boot-fr.pdf
spring-boot-fr.pdf
 
Cours JavaScript
Cours JavaScriptCours JavaScript
Cours JavaScript
 
Support JEE Servlet Jsp MVC M.Youssfi
Support JEE Servlet Jsp MVC M.YoussfiSupport JEE Servlet Jsp MVC M.Youssfi
Support JEE Servlet Jsp MVC M.Youssfi
 
Support de cours Spring M.youssfi
Support de cours Spring  M.youssfiSupport de cours Spring  M.youssfi
Support de cours Spring M.youssfi
 

Destaque

Workshop Spring - Session 5 - Spring Integration
Workshop Spring - Session 5 - Spring IntegrationWorkshop Spring - Session 5 - Spring Integration
Workshop Spring - Session 5 - Spring IntegrationAntoine Rey
 
Introduction à spring boot
Introduction à spring bootIntroduction à spring boot
Introduction à spring bootAntoine Rey
 
Les dessous du framework spring
Les dessous du framework springLes dessous du framework spring
Les dessous du framework springAntoine Rey
 
Workshop Spring 3 - Tests et techniques avancées du conteneur Spring
Workshop Spring  3 - Tests et techniques avancées du conteneur SpringWorkshop Spring  3 - Tests et techniques avancées du conteneur Spring
Workshop Spring 3 - Tests et techniques avancées du conteneur SpringAntoine Rey
 
Workshop Spring - Session 1 - L'offre Spring et les bases
Workshop Spring  - Session 1 - L'offre Spring et les basesWorkshop Spring  - Session 1 - L'offre Spring et les bases
Workshop Spring - Session 1 - L'offre Spring et les basesAntoine Rey
 
Introduction à Angular JS
Introduction à Angular JSIntroduction à Angular JS
Introduction à Angular JSAntoine Rey
 
Retours Devoxx France 2016
Retours Devoxx France 2016Retours Devoxx France 2016
Retours Devoxx France 2016Antoine Rey
 
Les Streams de Java 8
Les Streams de Java 8Les Streams de Java 8
Les Streams de Java 8Antoine Rey
 
Ces outils qui vous font gagner du temps
Ces outils qui vous font gagner du tempsCes outils qui vous font gagner du temps
Ces outils qui vous font gagner du tempsAntoine Rey
 
Spring Framework Petclinic sample application
Spring Framework Petclinic sample applicationSpring Framework Petclinic sample application
Spring Framework Petclinic sample applicationAntoine Rey
 
Tester unitairement une application java
Tester unitairement une application javaTester unitairement une application java
Tester unitairement une application javaAntoine Rey
 
Backday Xebia : Découvrez Spring Boot sur un cas pratique
Backday Xebia : Découvrez Spring Boot sur un cas pratiqueBackday Xebia : Découvrez Spring Boot sur un cas pratique
Backday Xebia : Découvrez Spring Boot sur un cas pratiquePublicis Sapient Engineering
 
Webcast Oracle - Gestion des risques liés à l'obsolescence et la sécurité de ...
Webcast Oracle - Gestion des risques liés à l'obsolescence et la sécurité de ...Webcast Oracle - Gestion des risques liés à l'obsolescence et la sécurité de ...
Webcast Oracle - Gestion des risques liés à l'obsolescence et la sécurité de ...Jean-Marc Hui Bon Hoa
 
Spring Batch - Lessons Learned out of a real life banking system.
Spring Batch - Lessons Learned out of a real life banking system.Spring Batch - Lessons Learned out of a real life banking system.
Spring Batch - Lessons Learned out of a real life banking system.Raffael Schmid
 
Three Key Concepts for Understanding JSR-352: Batch Programming for the Java ...
Three Key Concepts for Understanding JSR-352: Batch Programming for the Java ...Three Key Concepts for Understanding JSR-352: Batch Programming for the Java ...
Three Key Concepts for Understanding JSR-352: Batch Programming for the Java ...timfanelli
 

Destaque (20)

Workshop Spring - Session 5 - Spring Integration
Workshop Spring - Session 5 - Spring IntegrationWorkshop Spring - Session 5 - Spring Integration
Workshop Spring - Session 5 - Spring Integration
 
Introduction à spring boot
Introduction à spring bootIntroduction à spring boot
Introduction à spring boot
 
Les dessous du framework spring
Les dessous du framework springLes dessous du framework spring
Les dessous du framework spring
 
Workshop Spring 3 - Tests et techniques avancées du conteneur Spring
Workshop Spring  3 - Tests et techniques avancées du conteneur SpringWorkshop Spring  3 - Tests et techniques avancées du conteneur Spring
Workshop Spring 3 - Tests et techniques avancées du conteneur Spring
 
Spring Batch - concepts de base
Spring Batch - concepts de baseSpring Batch - concepts de base
Spring Batch - concepts de base
 
Workshop Spring - Session 1 - L'offre Spring et les bases
Workshop Spring  - Session 1 - L'offre Spring et les basesWorkshop Spring  - Session 1 - L'offre Spring et les bases
Workshop Spring - Session 1 - L'offre Spring et les bases
 
Introduction à Angular JS
Introduction à Angular JSIntroduction à Angular JS
Introduction à Angular JS
 
Retours Devoxx France 2016
Retours Devoxx France 2016Retours Devoxx France 2016
Retours Devoxx France 2016
 
Les Streams de Java 8
Les Streams de Java 8Les Streams de Java 8
Les Streams de Java 8
 
Ces outils qui vous font gagner du temps
Ces outils qui vous font gagner du tempsCes outils qui vous font gagner du temps
Ces outils qui vous font gagner du temps
 
Spring Framework Petclinic sample application
Spring Framework Petclinic sample applicationSpring Framework Petclinic sample application
Spring Framework Petclinic sample application
 
Tester unitairement une application java
Tester unitairement une application javaTester unitairement une application java
Tester unitairement une application java
 
Spring Batch
Spring BatchSpring Batch
Spring Batch
 
Backday Xebia : Découvrez Spring Boot sur un cas pratique
Backday Xebia : Découvrez Spring Boot sur un cas pratiqueBackday Xebia : Découvrez Spring Boot sur un cas pratique
Backday Xebia : Découvrez Spring Boot sur un cas pratique
 
ParisJUG Spring Boot
ParisJUG Spring BootParisJUG Spring Boot
ParisJUG Spring Boot
 
Webcast Oracle - Gestion des risques liés à l'obsolescence et la sécurité de ...
Webcast Oracle - Gestion des risques liés à l'obsolescence et la sécurité de ...Webcast Oracle - Gestion des risques liés à l'obsolescence et la sécurité de ...
Webcast Oracle - Gestion des risques liés à l'obsolescence et la sécurité de ...
 
SpringMVC
SpringMVCSpringMVC
SpringMVC
 
Spring Batch - Lessons Learned out of a real life banking system.
Spring Batch - Lessons Learned out of a real life banking system.Spring Batch - Lessons Learned out of a real life banking system.
Spring Batch - Lessons Learned out of a real life banking system.
 
Three Key Concepts for Understanding JSR-352: Batch Programming for the Java ...
Three Key Concepts for Understanding JSR-352: Batch Programming for the Java ...Three Key Concepts for Understanding JSR-352: Batch Programming for the Java ...
Three Key Concepts for Understanding JSR-352: Batch Programming for the Java ...
 
Spring Batch Introduction
Spring Batch IntroductionSpring Batch Introduction
Spring Batch Introduction
 

Semelhante a Workshop Spring - Session 4 - Spring Batch

WS User Group - Spring Batch - Xebia
WS User Group - Spring Batch - XebiaWS User Group - Spring Batch - Xebia
WS User Group - Spring Batch - XebiaOlivier BAZOUD
 
Chtijug springbatch 2011
Chtijug springbatch 2011Chtijug springbatch 2011
Chtijug springbatch 2011Olivier BAZOUD
 
Paris JUG Spring Batch
Paris JUG Spring BatchParis JUG Spring Batch
Paris JUG Spring BatchOlivier BAZOUD
 
"La Performance en Continue" à JMaghreb 3.0 - 05/11/2014
"La Performance en Continue" à JMaghreb 3.0 - 05/11/2014"La Performance en Continue" à JMaghreb 3.0 - 05/11/2014
"La Performance en Continue" à JMaghreb 3.0 - 05/11/2014Benoît de CHATEAUVIEUX
 
Un exemple élémentaire d'application MVC en PHP
Un exemple élémentaire d'application MVC en PHPUn exemple élémentaire d'application MVC en PHP
Un exemple élémentaire d'application MVC en PHPKristen Le Liboux
 
Intégration continue des projets PHP avec Jenkins
Intégration continue des projets PHP avec JenkinsIntégration continue des projets PHP avec Jenkins
Intégration continue des projets PHP avec JenkinsHugo Hamon
 
MongoDB 3.6 Customer Deck pptx.pptx
MongoDB 3.6 Customer Deck pptx.pptxMongoDB 3.6 Customer Deck pptx.pptx
MongoDB 3.6 Customer Deck pptx.pptxMongoDB
 
Les nouveautés de MongoDB 3.6
Les nouveautés de MongoDB 3.6Les nouveautés de MongoDB 3.6
Les nouveautés de MongoDB 3.6MongoDB
 
Importer des données dans Nuxeo Platform - Nuxeo Tour 2014 - workshop
Importer des données dans Nuxeo Platform - Nuxeo Tour 2014 - workshopImporter des données dans Nuxeo Platform - Nuxeo Tour 2014 - workshop
Importer des données dans Nuxeo Platform - Nuxeo Tour 2014 - workshopNuxeo
 
Power Shell V2 en action - avec Posh Board 2.0
Power Shell V2 en action - avec Posh Board 2.0Power Shell V2 en action - avec Posh Board 2.0
Power Shell V2 en action - avec Posh Board 2.0Patrick Guimonet
 
Spring Batch 17-05-2011
Spring Batch 17-05-2011Spring Batch 17-05-2011
Spring Batch 17-05-2011Normandy JUG
 
Workflow et bcs sous share point 2013
Workflow et bcs sous share point 2013Workflow et bcs sous share point 2013
Workflow et bcs sous share point 2013Nabil Babaci
 
Workflow et bcs sous SharePoint 2013
Workflow et bcs sous SharePoint 2013Workflow et bcs sous SharePoint 2013
Workflow et bcs sous SharePoint 2013Nabil Babaci
 
What's new in MongoDB 3.6
What's new in MongoDB 3.6What's new in MongoDB 3.6
What's new in MongoDB 3.6MongoDB
 
Intégration Continue PHP avec Jenkins CI
Intégration Continue PHP avec Jenkins CIIntégration Continue PHP avec Jenkins CI
Intégration Continue PHP avec Jenkins CIHugo Hamon
 

Semelhante a Workshop Spring - Session 4 - Spring Batch (20)

WS User Group - Spring Batch - Xebia
WS User Group - Spring Batch - XebiaWS User Group - Spring Batch - Xebia
WS User Group - Spring Batch - Xebia
 
Chtijug springbatch 2011
Chtijug springbatch 2011Chtijug springbatch 2011
Chtijug springbatch 2011
 
Paris JUG Spring Batch
Paris JUG Spring BatchParis JUG Spring Batch
Paris JUG Spring Batch
 
"La Performance en Continue" à JMaghreb 3.0 - 05/11/2014
"La Performance en Continue" à JMaghreb 3.0 - 05/11/2014"La Performance en Continue" à JMaghreb 3.0 - 05/11/2014
"La Performance en Continue" à JMaghreb 3.0 - 05/11/2014
 
Paris RailsCamp 2009
Paris RailsCamp 2009Paris RailsCamp 2009
Paris RailsCamp 2009
 
Spring Batch ParisJUG
Spring Batch ParisJUG Spring Batch ParisJUG
Spring Batch ParisJUG
 
Un exemple élémentaire d'application MVC en PHP
Un exemple élémentaire d'application MVC en PHPUn exemple élémentaire d'application MVC en PHP
Un exemple élémentaire d'application MVC en PHP
 
Présentation de jBPM 3.1
Présentation de jBPM 3.1Présentation de jBPM 3.1
Présentation de jBPM 3.1
 
Intégration continue des projets PHP avec Jenkins
Intégration continue des projets PHP avec JenkinsIntégration continue des projets PHP avec Jenkins
Intégration continue des projets PHP avec Jenkins
 
MongoDB 3.6 Customer Deck pptx.pptx
MongoDB 3.6 Customer Deck pptx.pptxMongoDB 3.6 Customer Deck pptx.pptx
MongoDB 3.6 Customer Deck pptx.pptx
 
Les nouveautés de MongoDB 3.6
Les nouveautés de MongoDB 3.6Les nouveautés de MongoDB 3.6
Les nouveautés de MongoDB 3.6
 
Importer des données dans Nuxeo Platform - Nuxeo Tour 2014 - workshop
Importer des données dans Nuxeo Platform - Nuxeo Tour 2014 - workshopImporter des données dans Nuxeo Platform - Nuxeo Tour 2014 - workshop
Importer des données dans Nuxeo Platform - Nuxeo Tour 2014 - workshop
 
Power Shell V2 en action - avec Posh Board 2.0
Power Shell V2 en action - avec Posh Board 2.0Power Shell V2 en action - avec Posh Board 2.0
Power Shell V2 en action - avec Posh Board 2.0
 
Spring Batch 17-05-2011
Spring Batch 17-05-2011Spring Batch 17-05-2011
Spring Batch 17-05-2011
 
Workflow et bcs sous share point 2013
Workflow et bcs sous share point 2013Workflow et bcs sous share point 2013
Workflow et bcs sous share point 2013
 
Workflow et bcs sous SharePoint 2013
Workflow et bcs sous SharePoint 2013Workflow et bcs sous SharePoint 2013
Workflow et bcs sous SharePoint 2013
 
What's new in MongoDB 3.6
What's new in MongoDB 3.6What's new in MongoDB 3.6
What's new in MongoDB 3.6
 
Intégration Continue PHP avec Jenkins CI
Intégration Continue PHP avec Jenkins CIIntégration Continue PHP avec Jenkins CI
Intégration Continue PHP avec Jenkins CI
 
Spring Batch
Spring BatchSpring Batch
Spring Batch
 
Rapport tp2 j2ee
Rapport tp2 j2eeRapport tp2 j2ee
Rapport tp2 j2ee
 

Workshop Spring - Session 4 - Spring Batch

  • 1. Workshop Spring - Session 4 Retour d’expérience Mise en oeuvre de Spring Batch Diffusé en janvier 2012 Réactualisé en décembre 2014
  • 2. Sommaire Introduction 3 Présentation de l’étude de cas 4 Objectifs 7 Mise en oeuvre 8 Pour aller plus loin 23 Conclusion 24 2 Retour d’Expérience sur la mise en oeuvre de Spring Batch
  • 3. Introduction • Qu’est-ce qu’un Batch ? • Suite de traitements sur un ensemble de données • sans intervention humaine • Java et les batchs • Spring Batch • Standardisation JSR-352 Batch Applications dans JEE 7 – Implémentation de référence : https://java.net/projects/jbatch/ • Aucune alternative aussi aboutie • Objectifs • Aperçu concret de sa Mise en oeuvre • Intégrer les fondamentaux • Avoir une vue d’ensemble de Ses fonctionnalités • L’utiliser demain 3 Workshop sur les batchs en java
  • 4. Présentation de l’étude de cas 4 Périmètre fonctionnel • Commandes réalisées depuis une application Web et stockées en base de données • Tous les soirs, un traitement batch émet un fichiers client et un fichier de facturation vers un Back Office Mainframe • Les commandes traitées sont marquées comme tel
  • 5. Présentation de l’étude de cas • Projet métier • Retarder l’exécution de 2 batchs quotidiens • Export de données au Mainframe réalisé à chaud • Batchs iso-fonctionnels • Recette complète par la MOA • Opportunités • Montée de version de framework : Spring et Hibernate • Migration d’un framework de batch maison à Spring Batch 2.1 • Déploiement automatisé des batchs • Fiabiliser l’exécution des batchs Gestion des erreurs et des codes retours • Améliorer la gestion des logs • Bénéficier de reporting 5 Origine du projet de migration
  • 6. Présentation de l’étude de cas 1. Récupère les identifiants des commandes à exporter 2. Charge les commandes à partir de leurs identifiants 3. Itère sur la liste des commandes 1. Génère les factures et identifie les clients 2. Construit les enregistrements CICS des factures et des clients 3. Incrémente les compteurs 4. Construit les enregistrements header et footer 5. Ecrit les enregistrements dans 2 fichiers temporaires 6. Met à jour en base de données un flag d’émission 7. Renomme les fichiers temporaires afin qu’ils soient pris en compte par le système de transfert de fichier 6 Batchs existants décomposés en 7 étapes
  • 7. Objectifs • Migration technique • Mêmes données en entrée • Mêmes fichiers en sortie • Evolutions techniques • Tests de non régressions – Tests de bout en bout basés sur : • Un échantillonnage de données de production • Des fichiers générés à partir du batch existant • Des outils : H2, Maven et JUnit • Tests selenium • Saisie et émission de commandes • Exécutés automatiquement avant, pendant et après le batch 7 Des batchs iso-fonctionnels
  • 8. Mise en oeuvre 8 Décomposition des batchs en une seule étape Base MySql avec Commandes Alerte par mail Erreur Lecture Ecriture Fichier de facturation Fichier des clients Traitement Construction Enregistrements CICS Une étape décomposée en 3 phases
  • 9. Spring Batch 9 Vocable Job Step Chunk Tasklet ItemReader ItemProcessor ItemWriter s Base G@el
  • 10. Spring Batch 10 Diagramme de séquence de traitement d’un chunk TaskletStep ItemReader ItemProcessor ItemWriter read item transform(items) transformedItems write(transformedItems) Chaque chunk s’exécute dans sa propre transaction Les items sont lus un à un ou en bloc La phase de traitement est optionnelle Le lot de données à traiter peut être morcelé en chunk Point de sauvegarde avant le commit
  • 11. Mise en oeuvre 11 Configuration d’un Job et d’un Step <!-- Job Spring Batch chargé d'exécuter le batch JM076--> <batch:job id="batchJM076Job" restartable="false"> <batch:step id="processCarOrderStep" parent="processOrderStep" /> </batch:job> Permet de mutualiser le step entre 2 batchs <!– Etape chargée d'émettre des commandes--> <batch:step id="processOrderStep" abstract="true"> <batch:tasklet transaction-manager="transactionManager"> <batch:chunk reader="orderReader" processor="orderProcessor" writer="billingAndCustomerWriter" … /> </batch:tasklet> … </batch:step> Référence 3 beans Spring Batch transactionnel
  • 12. Mise en oeuvre 12 Reader Hibernate Initialement décomposé en un bean parent générique et un bean spécifique au batch JM076 <!-- Reader Spring Batch chargé de récupérer les commandes à traiter depuis la base de données via Hibernate --> <bean id="orderReader" class="org.sf.batch.item.database.HibernateCursorItemReader" p:sessionFactory-ref="sessionFactory" p:useStatelessSession="false"> <property name="queryString" value="FROM Order order WHERE order.sentItemFlag is null ORDER BY id" /> </bean> Session Hibernate nécessaire pour le Lazy-loading Requête HQL de sélection des commandes à émettre
  • 13. Spring Batch 13 Quelques implémentations de Reader disponibles public interface ItemReader<T> { T read() throws Exception, UnexpectedInputException, ParseException; } Classes Propriétés StoredProcedureItemReader Nom de la procédure stockée, paramètres, row mapper JdbcPagingItemReader Taille d’une page, fournisseur de requêtes SQL pagninées, paramètres FlatFileItemReader Encodage, ressource à lire, lignes d’en-tête, line mapper, séparateur StaxEventItemReader Ressource XML à lire, élément racine, unmarshaller JmsItemReader Jms template, file JMS à lire
  • 14. Mise en oeuvre 14 Déclaration et implémentation d’un Item Processor <!-- Traite les commandes fin d'émettre les factures --> <bean id="orderProcessor" class="com.javaetmoi.batch.jm076.CarOrderProcessor" scope="step" p:billingCounter-ref="billingCounter" p:customerCounter-ref=« customerCounter" /> public class CarOrderProcessor implements ItemProcessor<Order, ProcessResultHolder> { public ProcessResultHolder process(Order order) throws BatchException { // … Création des factures et identification des clients return processResultHolder; } … }
  • 15. Mise en oeuvre 15 Configuration des writers (1/2) <!-- Writer composite Spring batch chargé de générer 2 fichiers pour le back office et de mettre à jour la base MySql--> <bean id="billingAndCustomerWriter" class="org.sf.batch.item.support.CompositeItemWriter"> <property name="delegates"> <list> <!-- Fichier des factures --> <ref bean=« billingWriter" /> <!-- Fichier des clients --> <ref bean="customerWriter" /> <!– Mis à jour indicateur de transmission dans la table des commandes --> <ref bean="orderFlagWriter" /> </list> </property> </bean> Writers délégués appelés séquentiellement dans l’ordre déclaré
  • 16. Spring Batch 16 Quelques implémentations de writers disponibles public interface ListItemWriter<T> { void write(List<? extends T> items) throws Exception; } Classes Propriétés HibernateItemWriter Template Hibernate JdbcBatchItemWriter Requête SQL, callback method chargé de setter les paramètres FlatFileItemWriter Encodage, fichier plat, séparateur de ligne, callbacks d’en-ête et de fin de fichier StaxEventItemWriter Fichier XML, élément racine, marshaller, callbacks d’en-ête et de fin de fichier SimpleMailMessageItemWriter Implémentation de MailSenders
  • 17. Mise en oeuvre 17 Configuration des writers (2/2) <!-- Writer Spring batch chargé d'écrire le fichier des factures --> <bean id="billingWriter" class="com.javaetmoi.core.batch.writer.ExtendedFlatFileItemWriter" p:lineSeparator="" p:encoding="ISO-8859-1" p:shouldDeleteIfError="true" /> <property name="lineAggregator"> <bean class="com.javaetmoi…common.item.BillingLineAggregator"/> </property> <property name="resource" value="file:${batch.data.out.path} /billing-jm076.dat"/> <property name="footerCallback" ref="billingFooterCallback" /> </bean> <!-- Met à jour le flag des factures envoyées au back office --> <bean id="billingFlagWriter" class="com.javaetmoi…common.item.GenericFlagWriter" p:processOrderToExport-ref="processOrderToExport" /> <bean id=" processOrderToExport " class="fr…batch.commun.services.ProcessOrdertoExport" p:orderDao-ref="orderDao" />
  • 18. Mise en oeuvre • Besoin • Une seule et unique transaction pour tout le batch • Les erreurs fonctionnelles ne doivent pas faire échouer le batch • Fichiers générés : tout ou rien • Comportement proposé par Spring Batch • Une transaction par chunk • Configuration des exceptions n’annulant pas la transaction • Les writers sur filesystem peuvent participer au contexte transactionnel • Solutions • Intervalle de commit réglé à l’infini pour avoir un unique chunk • Les exceptions de type BatchException ne provoquent pas de rollback • Les writers des factues et des clients sont enregistrés au Stream • Restauration en mémoire des compteurs assurée par un listener 18 Gestion des transactions (1/2)
  • 19. Mise en oeuvre 19 Gestion des transactions (2/2) <batch:tasklet transaction-manager="transactionManager" …> <batch:chunk … commit-interval="2147483647" …> <batch:streams> <batch:stream ref="billingWriter" /> <batch:stream ref="customerWriter" /> </batch:streams> … </batch:chunk> <batch:no-rollback-exception-classes> <batch:include class="com…common.exception.BatchException" /> </batch:no-rollback-exception-classes> … <batch:listeners> <batch:listener ref="orderProcessListener" /> … </batch:listeners> </batch:tasklet>
  • 20. Mise en oeuvre • Besoin • Erreur de traitement d’une commande non bloquante • Enregistrée dans les pistes d’audit • Être alerté par mail • Solutions • Les erreurs fonctionnelles signalées par des exceptions spécifiques ne doivent pas faire échouer le traitement – Non vérifiées, les BatchException sont levées lors de la génération des enregistrements – Paramétrable dans le chunk : skip-limit et skippable-exception-classes • Traces générées lorsqu’une exception est levée – Méthode onProcessError() de l’interface ItemProcessListener • Envoi de mail sur génération d’une trace de niveau >= à warning – Implémentation avec Logback : SMTPAppender, OnEventEvaluator, HTMLLayout 20 Gestion des erreurs (1/2)
  • 21. 21 Mise en oeuvre <batch:tasklet …> <batch:chunk … skip-limit="2147483647" …> … <batch:skippable-exception-classes> <batch:include class="com…common.exception.BatchException" /> </batch:skippable-exception-classes> </batch:chunk> … </batch:tasklet> public void onProcessError(Order order, Exception ex) { LOGGER.error("Une erreur est survenue lors du traitement de la commande n°{}: {}", order.getNumber(), ex.getMessage()); } Gestion des erreurs (2/2)
  • 22. Mise en oeuvre • Exécution possible en ligne de commande ou par programmation • Ordonnanceur : Quartz, $U, CRON, planificateur de tâches Windows … • Tests Junit et TestNG • JMX, Interface graphique, ServIces web … • Contexte projet : • Ordonnanceur Dollar Universe • Packagés dans un JAR – Extrait du MANIFEST.MF de myapp-batch-2.0.1.jar : – Main-Class: org.springframework.batch.core.launch.support.CommandLineJobRunner Class-Path: ./ojdbc-10.2.0.3-jdk14.jar ./spring-batch-core-3.0.2.RELEASE.jar … • En Ligne de commande – java -jar myapp-batch-2.0.1.jar com/javaetmoi/myapp/batch/applicationContext-batch-jm076.xml batchJM076Job 22 Exécution du batch
  • 23. Pour aller plus loin • Console d’administration et de suivi • Spring batch Admin • Reprise sur erreur • Réexécution d’une instance de job • Persistance du contexte • Exécution dynamique • Enchaînement conditionnels d’étapes • Paramètres d’entrée évalués dynamiquement • Scalabilité et Parallélisme • Exécution de chunk et de step en parallèle • Sur la même machine ou de manière distribuée • Partionnement des données 23 Fonctionnalités non présentées
  • 24. Conclusion • Code technique supprimé • Réutilisabilité du code métier • Création des enregistrements CICS à partir des commandes • Testabilité • Tests unitaires existants conservés • Tests de bout en bout ajoutés • Design Amélioré • Découpage mieux structuré • Peut-être encore meilleur si développé from scrath • Désenttement de l’ancien framework de batchs maison • Buggué au niveau du code retour en cas d’erreur • Exemple d’utilisation réutilisé pour 2 autres batchs • Job Repository persistant non exploité • Effort nécessaire pour monter en compétences • La connaissance du framework Spring est un pré-requis 24 Retours sur la migration vers Spring Batch
  • 25. Conclusion 25 Spring Batch en 3 mots Robuste • Fiable • Gestion des erreurs • Reprise • Tests unitaires • Performant • Standardisé Productif • Cadre de développement • Maintenabilité • Code technique fourni Extensible • Ouvert • Spring Batch Admin • Spring Intégration

Notas do Editor

  1. Qu’est-ce qu’un batch ? Pas nécessairement d’IHM – déclenchement en ligne de commande Traitements généralement sur de gros volumes de données, Planifiés à une heure fixe Un batch n’est pas un scheduler (cron / $U / Quartz) Exemples de batchs : Mise à jour de données du référentiel Reporting Technique d’intégration entre systèmes du SI (transfert de fichiers) qui n’ont pas besoin de temps réel Java et les batchs Frameworks batch open source : expresso ?, java batch and job framework (jbjf)
  2. Order (Commande) => Billing (facturation) + Customer (client)
  3. Reporting : reporting par mail en cas d’erreur et, à plus long termes, via l’outil Spring Batch Admin
  4. Lexique de Spring Batch Job : batch Spring Step : étape d’un traitement par lot. Un bath peut être composé de plusieurs étapes (workfow). Nouvelle portée : step Tasklet : interface portant une unique méthode execute() (références aux servlet, portlet) Chunk : sous-lot de données à traiter transactionnellement ItemXxx : tâche portant sur une donnée
  5. <batch: namespace Spring du DSL permettant de décrire un batch restartable à false : indique à Spring que le batch n’est pas conçu pour être redémarré de suite. En effet, le fichier Cobol généré lors de la première exécution serait écrasé avant qu’il ne soit transféré au CICS. Un seul step dont la configuration est définie dans un step parent (réutilisé dans 2 batchs similaires)
  6. ItemReader Renvoie null lorsqu’il n’y a plus aucune donnée Les implémentations n’ont pas besoin d’être thread-safe Autres implémentations : StaxEventItemReader HibernatePagingItemReader JpaPagingItemReader ListItemReader (intéressante pour les tests)
  7. Le bean a pour portée l’étape : il est créé au début du step et détruit à la fin Le bean orderProcessor référence 2 beans de compteurs en utilisant le namespace p: de Spring 3.0 La classe ProcessResultHolder est une classe spécifique contenant des listes de tableaux de byte, une pour les factures et une autre pour les clients Le mappging Classe Java  Enregistrements binaires COBOL / CICS a été facilité par un générateur de classe Java de RAD
  8. La classe ExtendedFlatFileItemWriter étend la classe FlatFileItemWriter de Spring Batch en lui ajoutant une propriété supplémentaire : Lorsqu'une erreur technique survient pendant une étape, la propriété shouldDeleteIfError de ce writer permet de supprimer le fichier de destination. En principe, du fait du buffering, ce fichier est vide ou ne contient qu'un footer. L'activation de ce comportement permet de rester en phase avec l'ancienne version du batch sans Spring Batch. Pour être utilisé, ce writer doit être enregistré en tant que listener au niveau du step La classe BillingtLigneAggregator est chargée d'aggrèger les enregistrements en fin de fichier à partir du tableau de bytes des enregistrements CICS Le 3ième bean customerWriter est déclaré similairement au bean bilingWriter
  9. Volumétrie : 300 commandes par jour (tout tient en mémoire) Streaming d’écriture : le contenu est bufférisé. Il est flusher lors d’un commit. Les beans implémentant l’interface ItemStream (ex: ItemWriter) peuvent participer aux transactions. Lorsqu’ils sont utilisés indirectements, via par exemple un CompositeItemWrite, doivent s’enregistrer dans la balise <streams> Un compteur d’enregistrements est incrémenté au cours du traitement des commandes. Il sert à générer le pied de fichier. Lorsqu’une exception fonctionnelle est levée, l’enregistrement en cours ne sera pas écrit. Le compteur doit en tenir compte. Un ItemProcessListener est donc enregistré. beforeProcess onProcessError Une autre solution aurait pu être implémenté à l’aide d’un delegate : cf. § « Writing a Summary Summer » du manuel de référence
  10. La valeur de l’attributt commit-interval correspond à Integer.MAX_VALUE Commit interval : nombre d’élements traités dans la même transaction Ajustable en fonction de plusieurs variables : Performance : ouverture/fermeture intempestive de transaction vs transaction longue Occupation mémoire Niveau de granularité des reprises sur incidents
  11. Step multi-thread : un task executor est référencé au niveau du step. Chaque chunk est exécuté par un thread différent.
  12. Code technique maison supprimé : Ouverture/fermeture de fichiers, DAO, Tests unitaires Si batch développé from scratch : Footer sans doute généré en suivant la bonne pratique du guide de référence Peut-être un second step pour gérer les erreurs : envoi de mail, suppression du fichier vide … Job Repository persistant : monitoring / suivi des batchs exécutés reprise après erreurs sans avoir à relancer tout le batch Montée en compétence : Documentation de Référence de Spring Batch 3 : PDF de 177 pages (http://docs.spring.io/spring-batch/reference/pdf/spring-batch-reference.pdf)
  13. Extensible : ajout d’un composant batch dans le socle technique du projet + cf. https://github.com/arey/spring-batch-toolkit