0% ont trouvé ce document utile (0 vote)
70 vues50 pages

Cours Spring Boot Batch

Spring Batch est un framework open-source pour le traitement par lots, permettant de gérer de grands volumes de données via des jobs configurables. Un job est composé de plusieurs étapes, chacune intégrant un lecteur, un processeur et un écrivain d'items. Le document fournit des exemples pratiques de configuration et d'utilisation de Spring Batch, notamment pour le traitement de fichiers CSV et l'intégration avec une base de données MySQL.

Transféré par

67psydkbxn
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
70 vues50 pages

Cours Spring Boot Batch

Spring Batch est un framework open-source pour le traitement par lots, permettant de gérer de grands volumes de données via des jobs configurables. Un job est composé de plusieurs étapes, chacune intégrant un lecteur, un processeur et un écrivain d'items. Le document fournit des exemples pratiques de configuration et d'utilisation de Spring Batch, notamment pour le traitement de fichiers CSV et l'intégration avec une base de données MySQL.

Transféré par

67psydkbxn
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Spring Batch

Achref El Mouelhi

Docteur de l’université d’Aix-Marseille


Chercheur en programmation par contrainte (IA)
Ingénieur en génie logiciel

[email protected]

H & H: Research and Training 1 / 40


Plan

1 Introduction

2 Exemple avec un Job et un Step

3 Exemple avec un Job, un Tasklet et un Step

4 Job programmé avec @Scheduled


@Scheduled
@EnableScheduling

H & H: Research and Training 2 / 40


Introduction

Spring Batch

Spring Batch

H I ©
Framework open-source (unique) pour le traitement par lots
Fournissant des fonctions réutilisables pour
U L grands volumes
Edes
de données
L MO
r e f
Fonctionnement principal E= { lecture de données ⇒ traitement de
A ch de données }
données ⇒ écriture
©
Configurable par XML ou classes Java

H & H: Research and Training 3 / 40


Introduction

Spring Batch

Exemple réel : opération de pointage

Les employés d’une entreprise pointent en début et fin de journée

H I ©
EL
La pointeuse renvoie généralement un fichier texte (d’extension
.csv)
M OU
e
le format de date etrtout f EL les pointages doubles, corriger
Il faut lire les données, supprimer

A ch sauvegarder dans la base de données


Traitement© périodique et répétitif
Pour automatiser le lancement, on peut utiliser Spring Batch

H & H: Research and Training 4 / 40


Introduction

Spring Batch

H I ©
U EL
O
f E LM
ch r e
©A
Source : documentation officielle

H & H: Research and Training 5 / 40


Introduction

Spring Batch

Explication

Job = { Step } (conteneur de Step).


Step = ItemReader + ItemProcessor + ItemWriter.
H I ©
EL
Chunk indique le nombre d’item à charger en mémoire. Par
U
O
exemple : si on passe la valeur 4 à chunk, on lit les items un par
E LM
un, une fois que le nombre d’éléments lus est égal à 4, le bloc
f
r e
entier est traité par ItemProcessor puis écrit par ItemWriter,
ch
A
et on continue avec les autres de la même manière.
©
JobLauncher exécute les jobs.
JobRepository contient les méta-données relatives aux différents
traitements.

H & H: Research and Training 6 / 40


Introduction

Spring Batch
Exemple avec chunk(2)

H I ©
U EL
O
f E LM
ch r e
©A

Source : documentation officielle

H & H: Research and Training 7 / 40


Introduction

Spring Batch
Création de projet Spring Boot

Aller dans File > New > Other

Chercher Spring, dans Spring Boot sélectionner Spring Starter Project et cli-
quer sur Next >

H I ©
EL
Saisir

OU
cours-spring-batch dans Name,
M
E L
com.example dans Group,
f
c hr e
cours-spring-batch dans Artifact

© A
com.example.demo dans Package
Cliquer sur Next

Chercher et cocher les cases correspondantes aux Spring Data JPA, MySQL Driver,
Spring Web, Spring Boot DevTools, Lombok et Spring Batch

Cliquer sur Next puis sur Finish

H & H: Research and Training 8 / 40


Introduction

Spring Batch
Explication

Le package contenant le point d’entrée de notre application (la classe


contenant le puclic static void main) est com.example.demo

I ©
Tous les autres packages dao, model... doivent être dans le package
H
demo.
UEL
O
f E LM
ch r e
©A

H & H: Research and Training 9 / 40


Introduction

Spring Batch
Explication

Le package contenant le point d’entrée de notre application (la classe


contenant le puclic static void main) est com.example.demo

I ©
Tous les autres packages dao, model... doivent être dans le package
H
demo.
U EL
O
f
Pour la suite, nous considérons E LM
r e
ch à définir dans com.example.demo.model
A
une entité Personne
©
une interface DAO PersonneRepository à définir dans
com.example.demo.dao

un contrôleur REST PersonneController à définir dans


com.example.demo.dao

H & H: Research and Training 9 / 40


Introduction

Spring Batch

Créons une entité Personne dans com.example.demo.model

@NoArgsConstructor
@AllArgsConstructor
@Data
H I ©
@Entity
UEL
public class Personne {
O
@Id
f E LM
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long num;
ch r e
©A
private String nom;
private String prenom;
private Long salaire;
}

H & H: Research and Training 10 / 40


Introduction

Spring Batch

Préparons notre interface DAO PersonneRepository

package com.example.demo.dao;

H I ©
EL
import org.springframework.data.jpa.repository.JpaRepository;
U
O
LM
import com.example.demo.model.Personne;

r e f E
public interface PersonneRepository extends JpaRepository<Personne,
Long> {
ch
} ©A

H & H: Research and Training 11 / 40


Introduction

Spring Batch

Considérons le fichier data.csv à créer dans


src/main/resources
H I ©
nom_p,prenom_p,salaire_p
UEL
O
LM
wick,john,1700
dalton,jack,2000
r e f E
maggio,carol,1900
ch
hoffman,mike,2300
©A

H & H: Research and Training 12 / 40


Exemple avec un Job et un Step

Spring Batch

Contexte et objectif

La RH de notre entreprise nous fournit régulièrement un fichier


H I ©
.csv contenant les noms et prénoms des nouvelles recrues ainsi
que les salaires négociés. U EL
M O
E L
À partir de ce fichier, nous souhaitons
f
ajouter ces personnes dans
la base de données.
c h re
© A aussi que le nom et la première lettre du prénom
Nous souhaitons
soient écrits en majuscule.

H & H: Research and Training 13 / 40


Exemple avec un Job et un Step

Dans application.properties, ajoutons les données permettant la connexion à la


base de données et la configuration de Hibernate

spring.datasource.url = jdbc:mysql://localhost:3306/cours_batch?
createDatabaseIfNotExist=true
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=create-drop
H I ©
EL
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.
MySQLDialect
O U
f E LM
ch r e
©A

H & H: Research and Training 14 / 40


Exemple avec un Job et un Step

Dans application.properties, ajoutons les données permettant la connexion à la


base de données et la configuration de Hibernate

spring.datasource.url = jdbc:mysql://localhost:3306/cours_batch?
createDatabaseIfNotExist=true
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=create-drop
H I ©
EL
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.
MySQLDialect
O U
E LM
Indiquons également l’emplacement de notre fichier CSV
f
input-file=classpath:/data.csv
ch r e
©A

H & H: Research and Training 14 / 40


Exemple avec un Job et un Step

Dans application.properties, ajoutons les données permettant la connexion à la


base de données et la configuration de Hibernate

spring.datasource.url = jdbc:mysql://localhost:3306/cours_batch?
createDatabaseIfNotExist=true
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=create-drop
H I ©
EL
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.
MySQLDialect
O U
E LM
Indiquons également l’emplacement de notre fichier CSV
f
input-file=classpath:/data.csv
ch r e
©A
Demandons à Spring Boot de ne pas lancer les jobs au démarrage de l’application

spring.batch.job.enabled = false

H & H: Research and Training 14 / 40


Exemple avec un Job et un Step

Dans application.properties, ajoutons les données permettant la connexion à la


base de données et la configuration de Hibernate

spring.datasource.url = jdbc:mysql://localhost:3306/cours_batch?
createDatabaseIfNotExist=true
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=create-drop
H I ©
EL
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.
MySQLDialect
O U
E LM
Indiquons également l’emplacement de notre fichier CSV
f
input-file=classpath:/data.csv
ch r e
©A
Demandons à Spring Boot de ne pas lancer les jobs au démarrage de l’application

spring.batch.job.enabled = false

Autorisons Spring Batch à générer ses tables nécessaires pour la gestion de lots

spring.batch.jdbc.initialize-schema=always

H & H: Research and Training 14 / 40


Exemple avec un Job et un Step

Spring Batch

Créons une classe de configuration pour Spring Batch

package com.example.demo.batch;
H I ©
import org.springframework.context.annotation.Configuration;
UEL
O
@Configuration
public class SpringBatchConfig {
f E LM
ch r e
©A
}

H & H: Research and Training 15 / 40


Exemple avec un Job et un Step

Spring Batch
Dans la classe SpringBatchConfig, nous commençons par injecter les éléments
indispensable pour le lancement d’un job

@Configuration
public class SpringBatchConfig {
@Value("${input.file}")
private Resource resource;
@Autowired
H I ©
private ItemWriter<Personne> itemWriter;
UEL
@Autowired
O
LM
private ItemProcessor<Personne, Personne> itemProcessor;
}

r e f E
ch
©A

H & H: Research and Training 16 / 40


Exemple avec un Job et un Step

Spring Batch
Dans la classe SpringBatchConfig, nous commençons par injecter les éléments
indispensable pour le lancement d’un job

@Configuration
public class SpringBatchConfig {
@Value("${input.file}")
private Resource resource;
@Autowired
H I ©
private ItemWriter<Personne> itemWriter;
UEL
@Autowired
O
LM
private ItemProcessor<Personne, Personne> itemProcessor;
}

r e f E
ch
©A
Les imports nécessaires

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.Resource;
import org.springframework.batch.item.ItemProcessor;
import org.springframework.batch.item.ItemWriter;

H & H: Research and Training 16 / 40


Exemple avec un Job et un Step

Spring Batch
Définissons un Bean pour le Job (dans SpringBatchConfig)

@Bean
public Job job(JobRepository jobRepository, Step step1) {
return new JobBuilder("Recrutement", jobRepository)
.start(step1)
.build();

}
// Recrutement : nom du job

H I ©
U EL
O
f E LM
ch r e
©A

H & H: Research and Training 17 / 40


Exemple avec un Job et un Step

Spring Batch
Définissons un Bean pour le Job (dans SpringBatchConfig)

@Bean
public Job job(JobRepository jobRepository, Step step1) {
return new JobBuilder("Recrutement", jobRepository)
.start(step1)
.build();

}
// Recrutement : nom du job

H I ©
U EL
O
f E LM
Nous devons donner à Spring plus de détail sur le Step

@Bean
ch r e
©A
public Step step1(JobRepository jobRepository, PlatformTransactionManager
platformTransactionManager) {
return new StepBuilder("première étape: chargement de fichier", jobRepository)
.<Personne, Personne>chunk(2, platformTransactionManager)
.reader(reader())
.processor(itemProcessor)
.writer(itemWriter)
.build();
}

H & H: Research and Training 17 / 40


Exemple avec un Job et un Step

Spring Batch

Définissons un Bean pour la lecture de données (dans SpringBatchConfig)

@Bean
public FlatFileItemReader<Personne> reader() {
return new FlatFileItemReaderBuilder<Personne>()
.name("personItemReader")
.resource(resource).linesToSkip(1)
.delimited()
H I ©
EL
.names(new String[] { "nom", "prenom", "salaire" })

{
O U
.fieldSetMapper(new BeanWrapperFieldSetMapper<Personne>() {

LM
setTargetType(Personne.class);
}

}
}).build();

r e f E
ch
©A

H & H: Research and Training 18 / 40


Exemple avec un Job et un Step

Spring Batch

Définissons un Bean pour la lecture de données (dans SpringBatchConfig)

@Bean
public FlatFileItemReader<Personne> reader() {
return new FlatFileItemReaderBuilder<Personne>()
.name("personItemReader")
.resource(resource).linesToSkip(1)
.delimited()
H I ©
EL
.names(new String[] { "nom", "prenom", "salaire" })

{
O U
.fieldSetMapper(new BeanWrapperFieldSetMapper<Personne>() {

LM
setTargetType(Personne.class);
}

}
}).build();

r e f E
ch
©A
Les imports nécessaires

import org.springframework.batch.item.file.FlatFileItemReader;
import org.springframework.batch.item.file.builder.FlatFileItemReaderBuilder;

H & H: Research and Training 18 / 40


Exemple avec un Job et un Step

Spring Batch

Explication

@Value("${inputFile}") Resource resource : permet de


récupérer le nom de fichier défini dans application.properties et
l’injecter dans resource
H I ©
UEL
linesToSkip(1) : pour ignorer la première ligne (contenant l’entête)
O
de notre fichier CSV
f E LM
ch r e
delimeted() : pour construire un objet DelimitedLineTokenizer

©A
names() : pour spécifier les noms des attributs de la classe Personne
présents dans le fichier

fieldSetMapper() : pour spécifier le type de mapping (ici le type de


sortie est un objet de la classe Personne)

H & H: Research and Training 19 / 40


Exemple avec un Job et un Step

Spring Batch

Définissons un Component appelé PersonneItemProcessor pour spécifier ce qu’on fera avec l’objet lu

package com.example.demo.batch;

import org.springframework.batch.item.ItemProcessor;
import org.springframework.stereotype.Component;
import com.example.demo.model.Personne;
H I ©
@Component
U EL
O
public class PersonneItemProcessor implements ItemProcessor<Personne, Personne> {

@Override

f E LM
public Personne process(final Personne personne) throws Exception {

r e
var nom = personne.getNom().toUpperCase();

ch
personne.setNom(nom);

©A
var prenom = personne.getPrenom();
prenom = prenom.substring(0, 1).toUpperCase() + prenom.substring(1).toLowerCase
();
personne.setPrenom(prenom);
return personne;
}
}

H & H: Research and Training 20 / 40


Exemple avec un Job et un Step

Spring Batch

Définissons un Component appelé PersonneItemWriter pour écrire l’objet transformé

package com.example.demo.batch;

import org.springframework.batch.item.Chunk;

©
import org.springframework.batch.item.ItemWriter;
import org.springframework.beans.factory.annotation.Autowired;

H I
EL
import org.springframework.stereotype.Component;

import com.example.demo.dao.PersonneRepository;
import com.example.demo.model.Personne;
O U
@Component

f E LM
@Autowired

ch e
public class PersonneItemWriter implements ItemWriter<Personne> {

r
private PersonneRepository personneRepository;

@Override
©A
public void write(Chunk<? extends Personne> chunk) throws Exception {
System.out.println(chunk);
personneRepository.saveAll(chunk);

H & H: Research and Training 21 / 40


Exemple avec un Job et un Step

Créons un contrôleur (qui nous permettra de lancer le Job) et commençons par injecter le
Job et JobLauncher

package com.example.demo.controller;

import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.JobParametersBuilder;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.web.bind.annotation.GetMapping;
H I ©
EL
import org.springframework.web.bind.annotation.RestController;

O U
LM
import lombok.AllArgsConstructor;

@RestController
r e f E
ch
@AllArgsConstructor

©A
public class JobInvokerController {

@Autowired
private JobLauncher jobLauncher;

@Autowired
private Job processJob;

H & H: Research and Training 22 / 40


Exemple avec un Job et un Step

Spring Batch
Ajoutons l’action qui permettra de lancer le Job

@RestController
@AllArgsConstructor
public class JobInvokerController {

private JobLauncher jobLauncher;


H I ©
private Job processJob;
U EL
O
LM
@GetMapping("/loadData")

r e f E
public String handle() throws Exception {

ch
JobParameters jobParameters = new JobParametersBuilder()

©A
.addLong("time", System.currentTimeMillis())
.toJobParameters();
jobLauncher.run(processJob, jobParameters);

return "Le job a été exécuté";


}
}

H & H: Research and Training 23 / 40


Exemple avec un Job, un Tasklet et un Step

Spring Batch

Objectif
H I ©
Supprimer le fichier data.csv après ajout
U L la base de
Edans
données
L MO
Utiliser un Tasklet e
r f
apr Ele premier Step pour supprimer le
ès
fichier
A ch
©

H & H: Research and Training 24 / 40


Exemple avec un Job, un Tasklet et un Step

Spring Batch

Tasklet
Comme un Step
H I ©
sans ItemWriter
UEL
O
généralement sans valeur de retour
f E LM
Utilisé souvent pour
ch r e
© A
appeler une procédure stockée
exécuter un script

H & H: Research and Training 25 / 40


Exemple avec un Job, un Tasklet et un Step

Spring Batch
Dans la classe SpringBatchConfig, ajoutons la déclaration de notre Tasklet

@Configuration
public class SpringBatchConfig {
@Autowired
private ItemWriter<Personne> itemWriter;
@Autowired
H I ©
@Value("${input.file}")
UEL
private ItemProcessor<Personne, Personne> itemProcessor;

O
LM
private Resource resource;
@Autowired
private Tasklet tasklet;
r e f E
ch
©A
// ...

H & H: Research and Training 26 / 40


Exemple avec un Job, un Tasklet et un Step

Spring Batch
Dans la classe SpringBatchConfig, ajoutons la déclaration de notre Tasklet

@Configuration
public class SpringBatchConfig {
@Autowired
private ItemWriter<Personne> itemWriter;
@Autowired
H I ©
@Value("${input.file}")
UEL
private ItemProcessor<Personne, Personne> itemProcessor;

O
LM
private Resource resource;
@Autowired
private Tasklet tasklet;
r e f E
ch
©A
// ...

L’import nécessaire

import org.springframework.batch.core.step.tasklet.Tasklet;

H & H: Research and Training 26 / 40


Exemple avec un Job, un Tasklet et un Step

Spring Batch
Modifions le Job précédent pour lancer le Tasklet après step1

@Bean
public Job job(JobRepository jobRepository, @Qualifier("step1") Step
step1, @Qualifier("deleteFile") Step deleteFile) {
return new JobBuilder("Recrutement", jobRepository)
.start(step1)
.next(deleteFile)
H I ©
}
.build();
UEL
O
f E LM
ch r e
©A

H & H: Research and Training 27 / 40


Exemple avec un Job, un Tasklet et un Step

Spring Batch
Modifions le Job précédent pour lancer le Tasklet après step1

@Bean
public Job job(JobRepository jobRepository, @Qualifier("step1") Step
step1, @Qualifier("deleteFile") Step deleteFile) {
return new JobBuilder("Recrutement", jobRepository)
.start(step1)
.next(deleteFile)
H I ©
}
.build();
UEL
O
f E LM
ch r e
Définissons le Tasklet défini dans le Job

@Bean
©A
public Step deleteFile(JobRepository jobRepository,
PlatformTransactionManager platformTransactionManager) {
return new StepBuilder("deuxième étape : suppression du fichier
CSV", jobRepository)
.tasklet(tasklet, platformTransactionManager)
.build();
}

H & H: Research and Training 27 / 40


Exemple avec un Job, un Tasklet et un Step

Définissons un Component appelé FileDeletingTasklet pour la suppression de notre fichier CSV

package com.example.demo.batch;

import java.io.File;

import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.UnexpectedJobExecutionException;
import org.springframework.batch.core.scope.context.ChunkContext;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.repeat.RepeatStatus;
import
import
org.springframework.beans.factory.annotation.Value;
org.springframework.core.io.Resource;
H I ©
EL
import org.springframework.stereotype.Component;

@Component
O U
LM
public class FileDeletingTasklet implements Tasklet {

@Value("${input.file}")

r e
private Resource resource;
f E
ch
©A
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext)
throws Exception {
File file = resource.getFile();
boolean deleted = file.delete();
if (!deleted) {
throw new UnexpectedJobExecutionException("Impossible de supprimer le
fichier " + file.getPath());
}
System.out.println("Fichier supprimé : " + file.getPath());
return RepeatStatus.FINISHED;
}
}

H & H: Research and Training 28 / 40


Exemple avec un Job, un Tasklet et un Step

Spring Batch
Rien à changer dans le contrôleur précédent

@RestController
public class JobInvokerController {

@Autowired
private JobLauncher jobLauncher;

H I ©
@Autowired
private Job processJob;
U EL
O
@RequestMapping("/loadData")
f E LM
ch r e
public String handle() throws Exception {

©A
JobParameters jobParameters = new JobParametersBuilder()
.addLong("time", System.currentTimeMillis())
.toJobParameters();
jobLauncher.run(processJob, jobParameters);

return "Le job a été exécuté";


}
}

H & H: Research and Training 29 / 40


Exemple avec un Job, un Tasklet et un Step

Spring Batch

Lancez le projet et allez à localhost:8080/loadData et vérifiez la présence des


messages suivants

....
H I ©
UEL
Executing step: [deuxième étape : suppression du fichier CSV]
Fichier supprimé : C:\Users\elmou\eclipse-workspace\first-spring-batch\
O
LM
target\classes\data.csv

e E
Step: [deuxième étape : suppression du fichier CSV] executed in 368ms
f
Job: [SimpleJob: [name=Recrutement]] completed with the following
r
ch
parameters: [{time=1600800074441}] and the following status: [

©A
COMPLETED] in 2s114ms
....

H & H: Research and Training 30 / 40


Exemple avec un Job, un Tasklet et un Step

Spring Batch
Explication

Un message nous indique que le fichier data.csv a été


supprimé
Ce n’est pas le data.csv qu’on a créé dans
H I ©
src/main/resources
UEL
O
f E LM
Le chemin affiché indique que le fichier supprimé se trouvait dans

ch r e
cours-spring-batch/target/classes

© A
En effet, Spring a déplacé data.csv qu’on a créé dans
src/main/resources dans target/classes/
Faites un clic droit sur le projet et cliquez sur Refresh et allez
vérifiez que Spring a de nouveau déplacé data.csv dans
first-spring-batch/target/classes

H & H: Research and Training 31 / 40


Exemple avec un Job, un Tasklet et un Step

Spring Batch

Question
Pourquoi Spring Boot a t-il redémarré l’application après suppression
de fichier ?
H I ©
UEL
O
f E LM
ch r e
©A

H & H: Research and Training 32 / 40


Exemple avec un Job, un Tasklet et un Step

Spring Batch

Question
Pourquoi Spring Boot a t-il redémarré l’application après suppression
de fichier ?
H I ©
UEL
O
f E LM
Réponse
ch r e
©A
Devtools a détecté un changement (suppression de fichier) et par
conséquence a redémarré l’application.

H & H: Research and Training 32 / 40


Job programmé avec @Scheduled

Spring Batch

Objectif
H I ©
EL
Supprimer le contrôleur
M OU
E
Programmer l’exécutionf du L (chaque minute par exemple)
Job
chr e
© A

H & H: Research and Training 33 / 40


Job programmé avec @Scheduled

Spring Batch

Commençons par créer une classe ScheduledJob

package com.example.demo.batch;
H I ©
import org.springframework.stereotype.Component;
UEL
O
@Component
public class ScheduledJob {
f E LM
ch r e
©A
}

H & H: Research and Training 34 / 40


Job programmé avec @Scheduled

Spring Batch

Injectons Job et JobLauncher

package com.example.demo.batch;

import org.springframework.batch.core.Job;
import org.springframework.batch.core.launch.JobLauncher;
H I ©
EL
import org.springframework.stereotype.Component;

import lombok.AllArgsConstructor;
O U
@Component
f E LM
@AllArgsConstructor
ch r e
©A
public class ScheduledJob {

private JobLauncher jobLauncher;


private Job job;

H & H: Research and Training 35 / 40


Job programmé avec @Scheduled

Spring Batch
Préparons la méthode qui va lancer le Job

package com.example.demo.batch;

import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.JobParametersBuilder;
import
import
org.springframework.batch.core.launch.JobLauncher;
org.springframework.stereotype.Component;

H I ©
import lombok.AllArgsConstructor;

U EL
@Component
O
LM
@AllArgsConstructor
public class ScheduledJob {

r e f E
ch
private JobLauncher jobLauncher;
private Job job;

©A
public void perform() throws Exception {
System.out.println("Job execution : start");
JobParameters jobParameters = new JobParametersBuilder()
.addLong("time", System.currentTimeMillis())
.toJobParameters();
jobLauncher.run(job, jobParameters);
}
}

H & H: Research and Training 36 / 40


Job programmé avec @Scheduled @Scheduled

Spring Batch
Programmons le lancement de ce Job toutes les minutes

package com.example.demo.batch;

import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.JobParametersBuilder;
import org.springframework.batch.core.launch.JobLauncher;
import
import
org.springframework.scheduling.annotation.Scheduled;
org.springframework.stereotype.Component;
H I ©
import lombok.AllArgsConstructor;

U EL
O
LM
@Component
@AllArgsConstructor
public class ScheduledJob {

r e f E
ch
private JobLauncher jobLauncher;

©A
private Job job;

@Scheduled(cron = "0 */1 * * * ?")


public void perform() throws Exception {
System.out.println("Job execution : start");
JobParameters jobParameters = new JobParametersBuilder()
.addLong("time", System.currentTimeMillis())
.toJobParameters();
jobLauncher.run(job, jobParameters);
}
}

H & H: Research and Training 37 / 40


Job programmé avec @Scheduled @Scheduled

Spring Batch

Explication

@Scheduled(fixedRate = 5000) : le job sera exécuté toutes les 5


secondes (5 secondes entre deux début d’exécution)
H I ©
@Scheduled(fixedDelay = 5000) : le job sera exL
U E écuté toutes les 5
M O
secondes (5 secondes après la fin de l’exécution précédente)

E L
peut la modifier ainsi : ref
L’unité par défaut pour fixedDelay et fixedRate est milliseconde, mais on

A
@Scheduled(fixedDelaych = 5, timeUnit = TimeUnit.SECONDS)
©
Pour fixedDelay et fixedRate, on peut spécifier ainsi le délai avant le
premier lancement :
@Scheduled(initialDelay = 1000, fixedRate = 5000)

H & H: Research and Training 38 / 40


Job programmé avec @Scheduled @Scheduled

Spring Batch

Exemple avec @Scheduled(cron = "* * * * * *")

H I ©
U EL
O
f E LM
ch r e
©A
Source : documentation officielle (Pour plus de détails :
https://docs.spring.io/spring-framework/docs/
current/reference/html/integration.html#
scheduling-cron-expression)

H & H: Research and Training 39 / 40


Job programmé avec @Scheduled @EnableScheduling

Spring Batch

Activons la programmation des Job dans la classe de démarrage avec l’annotation


@EnableScheduling

package com.example.demo;

import org.springframework.boot.SpringApplication;
H I ©
import org.springframework.boot.autoconfigure.SpringBootApplication;
U
import org.springframework.scheduling.annotation.EnableScheduling; EL
O
@SpringBootApplication
f E LM
@EnableScheduling

ch r e
public class CoursSpringBatchApplication {

©A
public static void main(String[] args) {
SpringApplication.run(CoursSpringBatchApplication.class, args);
}
}

H & H: Research and Training 40 / 40

Vous aimerez peut-être aussi