Blog ENI : Toute la veille numérique !
🐠 -25€ dès 75€ 
+ 7 jours d'accès à la Bibliothèque Numérique ENI. Cliquez ici
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. Java Spring
  3. Spring Batch
Extrait - Java Spring Le socle technique des applications Jakarta EE (4e édition)
Extraits du livre
Java Spring Le socle technique des applications Jakarta EE (4e édition) Revenir à la page d'achat du livre

Spring Batch

Introduction

Dans le monde de l’Informatique, nous séparons souvent les traitements en trois grandes familles : les traitements temps réels, les traitements par lots que l’on nomme batchs et une famille de traitements hybride, une composition des deux premiers comme le streaming qui traite de gros volumes en temps réel.

images/16EP01N.png

Les batchs d’aujourd’hui sont issus de programmes de migration et de modernisation d’anciens programmes, de traitements de masses classiques. Ils sont aussi utilisés pour le Big Data dans les applications modernes.

En général, on essaie de se passer des batchs et nous traitons les données au fil de l’eau ou dans l’application via des mini-batchs ou un ordonnanceur Spring @Scheduled. Dans certains cas, les batchs sont incontournables. 

En général, les traitements batchs demandent un accès complet et exclusif aux bases de données, ce qui implique un arrêt des traitements avec des interfaces homme-machine. À l’ère de la mondialisation, il devient impossible de fermer l’accès aux applications durant la période des batchs.

Aux débuts de l’Informatique, les traitements étaient souvent faits avec des Mainframes. Il faut savoir qu’un Mainframe est un très gros serveur (les gros peuvent atteindre 80 000 MIPS) hyper optimisé pour deux choses : il permet à un très grand nombre d’utilisateurs de saisir des données la journée via un terminal, pour les traiter en masse pendant la nuit. Ces Mainframes ont perduré jusqu’à aujourd’hui...

Architecture d’un batch

L’application Spring Batch se décompose en plusieurs parties. Une partie technique est codée sous forme d’un framework paramétrable et une partie réservée aux traitements spécifiques liés à la partie fonctionnelle est personnalisable.

Le batch est composé d’un lanceur : Le Job launcher, qui lance des travaux dit Job composés d’étapes nommés Step. Tout est tracé dans une base de données via le Repository.

images/16EP03N.png

Des listeners permettent également l’appel de code via des notifications sur le cycle de vie des travaux et des étapes.

Chaque étape (Job) est décomposée en trois parties :

images/16EP04N.png

Le Reader qui lit les données appelées Items en entrée, le Processor qui traite ces données et le Writer qui écrit les données en sortie.

Exemple Spring Batch version 4

Nous codons maintenant un exemple de petit batch pour illustrer le fonctionnement de Spring Batch.

Dépendance Maven :

<dependencies>   
   <dependency>   
       <groupId>org.springframework.batch</groupId>   
       <artifactId>spring-batch-core</artifactId>   
       <version>4.3.5.RELEASE</version>   
   </dependency>   
  <dependency>   
    <groupId>org.springframework.boot</groupId>   
    <artifactId>spring-boot-starter-batch</artifactId>   
  </dependency>   
</dependencies> 

Créons une classe main pour exécuter le batch :

@EnableBatchProcessing   
@SpringBootApplication   
public class Main {   
  public static void main(String [] args) {   
    System.exit(SpringApplication.exit(SpringApplication.run( 
        BatchConfiguration.class, args)));   
  }   
} 

Créons une classe de configuration pour configurer le batch avec un Job contenant...

Chargeur H2 depuis un CSV

Nous codons un second exemple qui montre comment charger un fichier CSV dans une base H2. L’exemple utilise un Reader (unité de lecture) pour accéder au contenu du fichier CSV. Il utilise le FlatFileItemReader pour lequel nous indiquons le format d’une ligne via la déclaration : FlatFileItemReader<Departement> reader = newFlatFile ItemReader<Departement>();. L’unité de lecture utilise un LineMapper pour décoder une ligne dans le fichier CSV. Nous avons un Writter pour écrire dans la base H2. Il s’agit d’un JdbcBatchItemWriter. Il stocke une ligne de données dans H2. Nous avons un ItemProcessor qui traite une ligne de données. Ici notre processeur met en majuscules les informations lues dans le fichier CSV. Nous avons un Job qui enchaîne des étapes nommées Step. Notre Step step1 lit la ligne dans le CSV, la traite avec le processor et l’enregistre dans H2.

Le lanceur :

@SpringBootApplication  
public class Application {  
 
  public static void main(String[] args) throws Exception {  
    SpringApplication.run(Application.class, args);  
  }  
}   

La classe Departement :

@Data  
@ToString  
@AllArgsConstructor  
@NoArgsConstructor  
public class Departement {  
  private String code;  
  private String nom;  
} 

La configuration du batch :

@Configuration  
@EnableBatchProcessing  
public class BatchConfiguration {  
 
  @Autowired  
  public JobBuilderFactory jobBuilderFactory;  
 
  @Autowired  
  public StepBuilderFactory stepBuilderFactory;  
 
  @Autowired  
  public DataSource dataSource;  
 
  // tag::readerwriterprocessor[]  
  @Bean  
  public FlatFileItemReader<Departement>...

Dépendances Spring Batch 3 et 4

Spring Batch 4 a revu toutes ses dépendances par rapport à Spring Batch 3 et demande Java 8+ et Spring 5+.

Autres nouveautés de la version 4

Il existe des builders pour ItemReader, ItemProcessor et ItemWriter ainsi qu’une panoplie de builders pour simplifier l’écriture des batchs dont le nom informe sur le contenu :

Élément

Builder

AmqpItemReader

AmqpItemReaderBuilder

ClassifierCompositeItemProcessor

ClassifierCompositeItemProcessorBuilder

ClassifierCompositeItemWriter

ClassifierCompositeItemWriterBuilder

CompositeItemWriter

CompositeItemWriterBuilder

FlatFileItemReader

FlatFileItemReaderBuilder

FlatFileItemWriter

FlatFileItemWriterBuilder

GemfireItemWriter

GemfireItemWriterBuilder

HibernateCursorItemReader

HibernateCursorItemReaderBuilder

HibernateItemWriter

HibernateItemWriterBuilder

HibernatePagingItemReader

HibernatePagingItemReaderBuilder

JdbcBatchItemWriter

JdbcBatchItemWriterBuilder

JdbcCursorItemReader

JdbcCursorItemReaderBuilder

JdbcPagingItemReader

JdbcPagingItemReaderBuilder

JmsItemReader

JmsItemReaderBuilder

JmsItemWriter

JmsItemWriterBuilder

JpaPagingItemReader

JpaPagingItemReaderBuilder

MongoItemReader

MongoItemReaderBuilder

MultiResourceItemReader

MultiResourceItemReaderBuilder

MultiResourceItemWriter

MultiResourceItemWriterBuilder

Neo4jItemWriter

Neo4jItemWriterBuilder

RepositoryItemReader

RepositoryItemReaderBuilder

RepositoryItemWriter

RepositoryItemWriterBuilder

ScriptItemProcessor

ScriptItemProcessorBuilder

SimpleMailMessageItemWriter

SimpleMailMessageItemWriterBuilder

SingleItemPeekableItemReader

SingleItemPeekableItemReaderBuilder...

Évolutions des batchs

Nous n’entrerons pas dans les détails, mais le monde du batch évolue vers une gestion de processus externes pour pouvoir utiliser les avantages du cloud, Spring Batch étant centré sur l’utilisation d’une seule machine.

Nous utiliserons alors Spring Cloud Data Flow avec Spring Boot Task et Spring Cloud Function.

Spring Cloud Function permet d’exécuter des fonctions à la demande via l’équivalent des lambdas AWS. Spring Boot Task permet de gérer un ordonnancement de tâches et Spring Cloud Data Flow intègre la notion de flux dans l’équation. Cela rajoute alors un niveau d’abstraction et il devient possible d’ordonnancer un ensemble beaucoup plus vaste :

images/EP1601.png

Points clés

  • Spring Batch est accessible même si on a peu d’expérience dans le domaine, car les problématiques techniques sont gérées automatiquement.

  • Spring Batch permet de convertir facilement des données d’un format à un autre.

  • Nous essayerons, autant que faire se peut, de traiter les données en temps réel pour minimiser le nombre de batchs.