Zurück zur Startseite

Spring Batch für Excel-Berichte ohne Timeouts

Der Artikel beschreibt die Implementierung von Spring Batch für asynchrone Generierung von Batches von Excel-Berichten. Aufschlüsselung der PRINT-, ZIP-, UPLOAD- und CLEAN_UP-Schritte mit Code-Beispielen. Fortschrittsintegration mit Frontend und Skalierung über Thread Pool.

Excel-Generierung in Batches: Spring Batch in der Produktion
Advertisement 728x90

Stapelverarbeitung von Excel-Berichten mit Spring Batch: Architektur und Implementierung

Spring Batch löst das Problem der synchronen Erstellung von Hunderten von Excel-Dokumenten innerhalb einer einzelnen HTTP-Anfrage. Das Framework unterteilt den Prozess in Chunks, verwaltet den Status und stellt die Wiederherstellung nach Fehlern sicher. In einem realen Projekt zur Automatisierung der Reparatur von Flugzeugtriebwerken ermöglichte dies Benutzern, den Stapeldruck von Arbeitskarten und Routenblättern ohne Timeouts auszulösen.

Kernkomponenten von Spring Batch

Job orchestriert den gesamten Zyklus: Excel-Erstellung, Archivierung, Speicherung-Upload und Bereinigung. Step ist eine Verarbeitungsstufe, Tasklet ist eine atomare Operation.

Der Prozess wird in chunk-orientierte Schritte (Lesen/Verarbeiten/Schreiben in Batches) und tasklet-basierte Schritte (Einzelaktion) unterteilt. Dies gewährleistet Stufenunabhängigkeit und zentralisierte Verwaltung.

Google AdInline article slot

Schritte zur Berichterstellung

Schritt DRUCKEN: Erstellung von Excel-Dateien

Daten werden in Chunks von 10 Elementen aufgeteilt. Jeder durchläuft Reader → Prozessor → Writer:

@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 verfolgt writeCount für den Fortschritt. Dateien werden unter /tmp/engine/{timestamp}/zip/ mit Unterordnern für Dokumenttypen gespeichert.

Schritt ZIP: Erstellung des Archivs

Ein Tasklet durchsucht das Verzeichnis und erstellt ein ZIP mit Standard-Java-Utilities.

Google AdInline article slot

Schritt HOCHLADEN: Upload zu S3

Das Archiv wird zu S3 hochgeladen, und der Link wird im ExecutionContext gespeichert.

Schritt BEREINIGUNG: Entfernung temporärer Daten

Ein JobExecutionListener prüft den Status und bereinigt /tmp bei Erfolg oder Fehler.

Nebenläufigkeit und Skalierung

Mehrere Jobs werden in einem Thread-Pool gestartet, um gleichzeitige Benutzeranfragen zu verarbeiten. Innerhalb eines Jobs wurden parallele Schritte nicht verwendet, aber das Framework unterstützt sie.

Google AdInline article slot

Frontend-Integration: Fortschrittsüberwachung

POST /trp-tag/print/excel/batch/start gibt eine jobExecutionId zurück. GET /trp-tag/print/excel/batch/{id} gibt den Status zurück.

Der Fortschritt wird wie folgt berechnet:

  • DRUCKEN: proportional zu writeCount (90 % der Zeit).
  • Verbleibende Schritte: 0 % oder 100 %.

Das Frontend erhält:

  • progressPercentage für die Fortschrittsleiste.
  • currentStepNumber/totalStepsNumber.
  • status (GESTARTET/ABGESCHLOSSEN/FEHLGESCHLAGEN).
  • downloadUrl.
  • failureDetails.
  • durationMillis.

Implementierungsvorteile

  • Asynchrone Verarbeitung: Sofortige Antwort statt Timeouts.
  • Persistenz: Historie in PostgreSQL gespeichert ohne zusätzliche Infrastruktur.
  • Transaktionsintegrität: Automatische Statusverwaltung, anders als bei @Async.

Wichtige Erkenntnisse

  • Eine Chunk-Größe von 10 minimiert den Speicherverbrauch und gewährleistet Fortschrittsverfolgung.
  • WriteCount ist ein eingebauter Zähler für präzise Überwachung.
  • ExecutionContext speichert Referenzen auf Artefakte.
  • JobExecutionListener garantiert Bereinigung.
  • Thread-Pool skaliert mehrere Jobs gleichzeitig.

Spring Batch eignet sich für jede Stapelerstellung von Dokumenten mit Archivierung und Speicherung. Die Implementierung dauert weniger Zeit als benutzerdefinierte Logik mit Warteschlangen.

— Editorial Team

Advertisement 728x90

Weiterlesen