Zpět na domů

Spring Batch pro Excel zprávy bez timeoutů

Článek popisuje implementaci Spring Batch pro asynchronní generování dávků Excel zpráv. Rozbor kroků PRINT, ZIP, UPLOAD, CLEAN_UP s příklady kódu. Integrace pokroku s front-endem a škálování přes Thread Pool.

Generování Excel po dávkách: Spring Batch v produkci
Advertisement 728x90

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.

Google AdInline article slot

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.

Google AdInline article slot

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.

Google AdInline article slot

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

Advertisement 728x90

Číst dál