Traitement par lots de rapports Excel avec Spring Batch : Architecture et mise en œuvre
Spring Batch résout le problème de génération synchrone de centaines de documents Excel dans une seule requête HTTP. Le framework découpe le processus en blocs, gère l'état et assure la reprise après des échecs. Dans un projet réel d'automatisation de réparation de moteurs d'avion, cela a permis aux utilisateurs de déclencher l'impression par lots de fiches de travail et de feuilles de routage sans dépassement de délai.
Composants principaux de Spring Batch
Job orchestre l'ensemble du cycle : génération Excel, archivage, téléversement en stockage et nettoyage. Step est une étape de traitement, Tasklet est une opération atomique.
Le processus est divisé en étapes orientées blocs (lecture/traitement/écriture par lots) et en étapes basées sur des tasklets (action unique). Cela garantit l'indépendance des étapes et une gestion centralisée.
Étapes pour la génération de rapports
Étape PRINT : Création des fichiers Excel
Les données sont divisées en blocs de 10 éléments. Chacun passe par lecteur → processeur → écrivain :
@Bean
@JobScope
public Step printTrpTagsStep(
ItemReader<TrpTagForPrintModel> excelTrpTagItemReader,
ItemProcessor<TrpTagForPrintModel, ExcelItem> excelTrpTagItemProcessor,
ItemWriter<ExcelItem> excelTrpTagItemWriter
) {
return new StepBuilder(BatchExcelPrintStep.PRINT.getCode(), jobRepository)
.<TrpTagForPrintModel, ExcelItem>chunk(10)
.transactionManager(transactionManager)
.reader(excelTrpTagItemReader)
.processor(excelTrpTagItemProcessor)
.writer(excelTrpTagItemWriter)
.build();
}
Spring Batch suit writeCount pour la progression. Les fichiers sont enregistrés dans /tmp/engine/{timestamp}/zip/ avec des sous-dossiers pour les types de documents.
Étape ZIP : Création de l'archive
Une Tasklet scanne le répertoire et crée un ZIP en utilisant les utilitaires Java standard.
Étape UPLOAD : Téléversement vers S3
L'archive est téléversée vers S3, et le lien est enregistré dans ExecutionContext.
Étape CLEAN_UP : Suppression des données temporaires
Un JobExecutionListener vérifie le statut et nettoie /tmp en cas de succès ou d'échec.
Concurrence et mise à l'échelle
Plusieurs Jobs sont lancés dans un pool de threads pour gérer les requêtes utilisateur concurrentes. Dans un Job, les étapes parallèles n'ont pas été utilisées, mais le framework les prend en charge.
Intégration frontend : Surveillance de la progression
POST /trp-tag/print/excel/batch/start renvoie un jobExecutionId. GET /trp-tag/print/excel/batch/{id} renvoie le statut.
La progression est calculée comme suit :
- PRINT : proportionnelle à writeCount (90 % du temps).
- Étapes restantes : 0 % ou 100 %.
Le frontend reçoit :
- progressPercentage pour la barre de progression.
- currentStepNumber/totalStepsNumber.
- status (STARTED/COMPLETED/FAILED).
- downloadUrl.
- failureDetails.
- durationMillis.
Avantages de la mise en œuvre
- Traitement asynchrone : Réponse instantanée au lieu de dépassements de délai.
- Persistance : Historique stocké dans PostgreSQL sans infrastructure supplémentaire.
- Intégrité transactionnelle : Gestion automatique de l'état, contrairement à @Async.
Points clés à retenir
- Une taille de bloc de 10 minimise l'utilisation de la mémoire et assure le suivi de la progression.
- WriteCount est un compteur intégré pour une surveillance précise.
- ExecutionContext stocke les références aux artefacts.
- JobExecutionListener garantit le nettoyage.
- Le pool de threads met à l'échelle plusieurs Jobs simultanément.
Spring Batch convient à toute génération de documents par lots avec archivage et stockage. La mise en œuvre prend moins de temps qu'une logique personnalisée avec des files d'attente.
— Editorial Team
Aucun commentaire pour le moment.