Formation Java / Spring Boot – Traitements industriels & batch
Job
Step
ItemReader
ItemProcessor
ItemWriter
Dans un système bancaire, d’assurance ou de gestion complexe avec de gros fichiers à traiter périodiquement, le Batch est bienvenu pour :
Du coup, ces traitements :
On pourrait remplacer Temps réel par Synchrone dans le tableau ci-dessous :
Temps réel
Synchrone
Spring Boot gère l’API et Spring Batch gère les traitements lourds.
Un traitement batch est structuré ainsi :
Job └── Step ├── ItemReader ├── ItemProcessor └── ItemWriter
Le Job représente un traitement complet (Calcul intérêts journaliers).
Le Step est une étape d’un job et peut correspondre à :
Reader
Processor
Writer
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-batch</artifactId> </dependency>
Cas métier, chaque nuit vous devez :
@Configuration @EnableBatchProcessing public class BatchConfig { }
@Bean public JpaPagingItemReader<CompteEpargne> reader(EntityManagerFactory emf) { JpaPagingItemReader<CompteEpargne> reader = new JpaPagingItemReader<>(); reader.setEntityManagerFactory(emf); reader.setQueryString("SELECT c FROM CompteEpargne c"); reader.setPageSize(10); return reader; }
@Bean public ItemProcessor<CompteEpargne, CompteEpargne> processor() { return compte -> { BigDecimal taux = new BigDecimal("0.01"); BigDecimal interet = compte.getSolde().multiply(taux); compte.crediter(interet); return compte; }; }
@Bean public JpaItemWriter<CompteEpargne> writer(EntityManagerFactory emf) { JpaItemWriter<CompteEpargne> writer = new JpaItemWriter<>(); writer.setEntityManagerFactory(emf); return writer; }
Encore le pattern Builder.
Builder
@Bean public Step calculInteretsStep( JobRepository jobRepository, PlatformTransactionManager transactionManager, ItemReader<CompteEpargne> reader, ItemProcessor<CompteEpargne, CompteEpargne> processor, ItemWriter<CompteEpargne> writer) { return new StepBuilder("calculInteretsStep", jobRepository) .<CompteEpargne, CompteEpargne>chunk(10, transactionManager) .reader(reader) .processor(processor) .writer(writer) .build(); }
@Bean public Job calculInteretsJob(JobRepository jobRepository, Step calculInteretsStep) { return new JobBuilder("calculInteretsJob", jobRepository) .start(calculInteretsStep) .build(); }
.chunk(10, transactionManager)
Signifie :
Vous devez ajouter :
.faultTolerant() .skip(Exception.class) .skipLimit(5)
Cela permet de :
Consignes :
Objectif :
@Bean public FlatFileItemWriter<Compte> csvWriter() { FlatFileItemWriter<Compte> writer = new FlatFileItemWriter<>(); writer.setResource(new FileSystemResource("comptes.csv")); writer.setLineAggregator(compte -> compte.getNumero() + ";" + compte.getSolde()); return writer; }
Reader CSV ci-dessous :
@Bean public FlatFileItemReader<CompteDTO> csvReader() { FlatFileItemReader<CompteDTO> reader = new FlatFileItemReader<>(); reader.setResource(new FileSystemResource("input.csv")); return reader; }
Pour chaque chunk :
Spring Batch stocke l’état en base :
Tables :
La reprise après crash est possible !
Votre projet est désormais :
Vous savez maintenant :
On abordera (optionnel) :