Retour à l'accueil

Spring Batch pour les rapports Excel sans timeouts

L'article décrit l'implémentation de Spring Batch pour la génération asynchrone de lots de rapports Excel. Décomposition des steps PRINT, ZIP, UPLOAD, CLEAN_UP avec des exemples de code. Intégration de la progression avec frontend et mise à l'échelle via Thread Pool.

Génération Excel par lots : Spring Batch en production
Advertisement 728x90

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.

Google AdInline article slot

É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.

Google AdInline article slot

É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.

Google AdInline article slot

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

Advertisement 728x90

Lire ensuite