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.
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.
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.
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
Noch keine Kommentare.