Spring Batch est un framework léger et complet conçu pour permettre le développement d’applications batch robustes essentielles pour les systèmes d’entreprise. Il offre des fonctionnalités réutilisables nécessaires au traitement de grands volumes de données, incluant la journalisation/suivi, la gestion des transactions, les statistiques de traitement des jobs, la reprise des jobs, le saut et la gestion des ressources. Spring Batch est idéal pour le traitement de grandes quantités de données telles que la lecture à partir d’une base de données ou d’un fichier, le traitement de ces données, puis l’écriture dans une base de données ou un autre fichier.
Traitement Batch
Le traitement batch consiste à exécuter une série de tâches de manière séquentielle sans intervention manuelle. C’est particulièrement utile pour des opérations répétitives et volumineuses comme la génération de rapports, le transfert de données ou le traitement de transactions. Les applications batch fonctionnent en arrière-plan et peuvent traiter d’énormes volumes de données en lots.
Concepts Clés de Spring Batch
Job
Un job dans Spring Batch représente le processus batch complet. Il est composé d’une séquence de steps. Chaque job a une configuration bien définie qui inclut les étapes à exécuter et la façon dont elles doivent être gérées.
Step
Un step est une phase unique du job. Il encapsule la logique de traitement. Chaque step peut inclure un ItemReader (pour lire les données), un ItemProcessor (pour traiter les données) et un ItemWriter (pour écrire les données).
ItemReader
L’ItemReader est utilisé pour lire les données d’une source de données. Cela peut être une base de données, un fichier, etc. L’ItemReader lit les données en lots pour un traitement plus efficace.
ItemProcessor
L’ItemProcessor est utilisé pour appliquer une logique de transformation sur les données lues par l’ItemReader. Il reçoit un élément en entrée, le traite, puis renvoie l’élément transformé.
ItemWriter
L’ItemWriter est utilisé pour écrire les données transformées dans une destination. Cela peut être une base de données, un fichier, etc.
JobRepository
Le JobRepository est un composant clé de Spring Batch. Il est responsable de la gestion de l’état des jobs et des steps. Il stocke des informations telles que les métadonnées des jobs, l’état d’exécution, les paramètres et les statistiques. Cela permet de suivre, redémarrer et gérer les jobs de manière fiable.
Exécution du Job
JobExecution
JobExecution représente l’exécution d’une instance de job. Il contient des informations sur l’état d’exécution, le temps de démarrage, le temps de fin et d’autres métadonnées.
StepExecution
StepExecution représente l’exécution d’une instance de step. Comme JobExecution, il contient des informations sur l’état d’exécution, les temps de démarrage et de fin, et les statistiques de traitement.
JobExecution vs JobInstance
JobInstance
JobInstance représente une instance unique d’un job dans Spring Batch. Chaque fois qu’un job est lancé avec un ensemble de paramètres spécifiques, une nouvelle instance de JobInstance est créée. Cela signifie qu’une même définition de job peut avoir plusieurs instances en fonction des paramètres avec lesquels elle est lancée.
Caractéristiques de JobInstance :
- Identifiant Unique : Chaque JobInstance est identifiée par un identifiant unique, généralement un nombre.
- Nom du Job : Chaque instance de job est associée à un nom de job spécifique qui est défini lors de la création du job.
- Paramètres : Les paramètres spécifiques associés à cette instance de job peuvent influencer son comportement et ses résultats.
Par exemple, si vous avez un job qui importe des données d’un fichier CSV vers une base de données, chaque lancement de ce job avec un fichier CSV différent constituerait une nouvelle instance de JobInstance.
JobExecution
JobExecution représente l’exécution spécifique d’une instance de job dans Spring Batch. Chaque fois qu’une instance de job est lancée, une nouvelle instance de JobExecution est créée pour suivre et gérer cette exécution.
Caractéristiques de JobExecution :
- Identifiant Unique : Chaque JobExecution est identifiée par un identifiant unique, généralement un nombre.
- JobInstance Associée : Chaque JobExecution est associée à une instance spécifique de JobInstance.
- Statut de l’Exécution : Indique si l’exécution du job est en cours, terminée avec succès, échouée, etc.
- Temps de Démarrage et de Fin : Enregistre l’heure de début et l’heure de fin de l’exécution du job.
- Détails d’Exécution : Comprend des informations supplémentaires telles que les messages de sortie, les exceptions rencontrées, etc.
Par exemple, si vous lancez un job d’importation de données à partir d’un fichier, chaque lancement de ce job générera une nouvelle JobExecution avec son propre identifiant et ses détails spécifiques d’exécution.
Scheduling des Batch avec les CRON
Qu’est-ce qu’un Cron ?
Un cron est une syntaxe spécifique utilisée pour définir des horaires dans les systèmes Unix et Unix-like, y compris Linux. Dans le contexte de Spring Batch (et plus largement dans celui de la programmation), un cron permet de planifier l’exécution récurrente de tâches selon une syntaxe temporelle précise.
Syntaxe d’un Cron
Un cron suit une syntaxe particulière pour déterminer quand une tâche doit être exécutée:
Chaque champ représente une unité de temps différente et vous pouvez spécifier une valeur unique, une liste de valeurs séparées par des virgules, des intervalles ou des caractères spéciaux comme ‘*’ pour toutes les valeurs.
Utilisation dans Spring Batch
Dans Spring Batch, vous pouvez utiliser des cron pour planifier l’exécution de vos jobs batch à des intervalles réguliers. Voici un exemple simple :
Exemple :
@Scheduled(cron = “0 */10 * * * *”)
Cette annotation indique à Spring de planifier la méthode launchJob() pour s’exécuter selon le cron spécifié. Dans cet exemple, “0 */10 * * * *” signifie que la méthode sera appelée chaque fois que les secondes sont égales à 0 et les minutes sont multiples de 10 (c’est-à-dire toutes les 10 minutes).
Exemple de Lecture d’un Fichier CSV et d’Ajout des Étudiants dans une Base de Données MySQL
application.yml
spring:
datasource:
url: jdbc:mysql://localhost:3306/test
username: user
password: pass
batch:
initialize-schema: always
Entity Student
@Entity
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private int creditSolde;
// getters and setters
}
Students.csv
id,name,credit_solde
1,jack,12
2,alice,34
Conclusion
Spring Batch est une solution puissante et flexible pour le traitement par lots dans les applications Java. En utilisant ses composants bien définis comme les Jobs, Steps, ItemReaders, ItemProcessors, et ItemWriters, il est possible de concevoir des processus batch robustes et réutilisables. La gestion des exécutions de jobs et de steps, ainsi que la possibilité de planifier ces exécutions à l’aide de cron expressions, font de Spring Batch un outil incontournable pour les développeurs d’applications d’entreprise nécessitant le traitement de grandes quantités de données. Grâce à Spring Batch, les tâches répétitives et volumineuses peuvent être automatisées, améliorant ainsi l’efficacité opérationnelle et la fiabilité des systèmes.