Dávkové zpracování Excelových reportů pomocí Spring Batch: Architektura a implementace
Spring Batch řeší problém synchronní generace stovek Excelových dokumentů v jednom HTTP požadavku. Framework rozděluje proces na části (chunks), spravuje stav a zajišťuje obnovu po selhání. V reálném projektu pro automatizaci oprav leteckých motorů to umožnilo uživatelům spouštět dávkový tisk pracovních karet a trasových listů bez časových limitů.
Hlavní komponenty Spring Batch
Job spojuje celý cyklus: generaci Excelu, archivaci, nahrání do úložiště a vyčištění. Step je fáze zpracování, Tasklet je atomická operace.
Proces se dělí na chunk-oriented kroky (čtení/zpracování/zápis po částech) a tasklet-based (jedna akce). To zajišťuje nezávislost fází a centralizovanou správu.
Kroky generace reportů
Krok PRINT: Vytváření Excelových souborů
Data se rozdělí na části po 10 položkách. Každá projde reader → processor → 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 sleduje writeCount pro průběh. Soubory se ukládají do /tmp/engine/{timestamp}/zip/ s podadresáři podle typů dokumentů.
Krok ZIP: Zabalení archivu
Tasklet prohledá adresář a vytvoří ZIP standardními prostředky Javy.
Krok UPLOAD: Umístění v S3
Archiv se nahraje do S3, odkaz se zaznamená v ExecutionContext.
Krok CLEAN_UP: Odstranění dočasných dat
JobExecutionListener zkontroluje stav a vyčistí /tmp při úspěchu nebo selhání.
Paralelismus a škálování
Několik Job se spouští v Thread Pool pro současné zpracování požadavků uživatelů. Uvnitř Job se paralelní kroky nepoužívaly, ale framework je podporuje.
Integrace s frontendem: Sledování průběhu
POST /trp-tag/print/excel/batch/start vrátí jobExecutionId. GET /trp-tag/print/excel/batch/{id} poskytne stav.
Průběh se vypočítá takto:
- PRINT: úměrně writeCount (90 % času).
- Zbývající kroky: 0 % nebo 100 %.
Frontend obdrží:
- progressPercentage pro ukazatel.
- currentStepNumber/totalStepsNumber.
- status (STARTED/COMPLETED/FAILED).
- downloadUrl.
- failureDetails.
- durationMillis.
Výhody implementace
- Asynchronita: okamžitá odezva místo časových limitů.
- Trvalost: historie v PostgreSQL bez dodatečné infrastruktury.
- Transakčnost: automatická správa stavu, na rozdíl od @Async.
Co je důležité
- Chunk po 10 položkách minimalizuje paměť a zajišťuje průběh.
- WriteCount je vestavěný čítač pro přesné sledování.
- ExecutionContext uchovává odkazy na artefakty.
- JobExecutionListener zaručuje vyčištění.
- Thread Pool škáluje několik Job současně.
Spring Batch je vhodný pro jakoukoli dávkovou generaci dokumentů s archivací a ukládáním. Implementace zabere méně času než vlastní logika s frontami.
— Editorial Team
Zatím žádné komentáře.