Volver al inicio

Spring Batch para informes Excel sin tiempos de espera

El artículo describe la implementación de Spring Batch para generación asíncrona de lotes de informes Excel. Desglose de los pasos PRINT, ZIP, UPLOAD, CLEAN_UP con ejemplos de código. Integración de progreso con frontend y escalado vía Thread Pool.

Generación de Excel en lotes: Spring Batch en producción
Advertisement 728x90

Procesamiento por Lotes de Reportes Excel con Spring Batch: Arquitectura e Implementación

Spring Batch resuelve el problema de generar cientos de documentos Excel de forma síncrona dentro de una única petición HTTP. El framework divide el proceso en fragmentos, gestiona el estado y garantiza la recuperación ante fallos. En un proyecto real de automatización de reparación de motores de avión, esto permitió a los usuarios activar la impresión por lotes de tarjetas de trabajo y hojas de ruta sin tiempos de espera excesivos.

Componentes Principales de Spring Batch

Job orquesta todo el ciclo: generación de Excel, archivado, carga en almacenamiento y limpieza. Step es una etapa de procesamiento, Tasklet es una operación atómica.

El proceso se divide en pasos orientados a fragmentos (lectura/procesamiento/escritura por lotes) y pasos basados en tasklets (acción única). Esto garantiza independencia entre etapas y gestión centralizada.

Google AdInline article slot

Pasos para la Generación de Reportes

Paso IMPRIMIR: Creación de Archivos Excel

Los datos se dividen en fragmentos de 10 elementos. Cada uno pasa por lector → procesador → escritor:

@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 rastrea writeCount para el progreso. Los archivos se guardan en /tmp/engine/{timestamp}/zip/ con subcarpetas para tipos de documento.

Paso ZIP: Creación del Archivo Comprimido

Un Tasklet escanea el directorio y crea un ZIP utilizando utilidades estándar de Java.

Google AdInline article slot

Paso CARGAR: Subida a S3

El archivo comprimido se sube a S3 y el enlace se registra en el ExecutionContext.

Paso LIMPIAR: Eliminación de Datos Temporales

Un JobExecutionListener verifica el estado y limpia /tmp en caso de éxito o fallo.

Concurrencia y Escalabilidad

Se lanzan múltiples Jobs en un Thread Pool para manejar peticiones concurrentes de usuarios. Dentro de un Job, no se utilizaron pasos paralelos, pero el framework los soporta.

Google AdInline article slot

Integración con Frontend: Monitoreo del Progreso

POST /trp-tag/print/excel/batch/start devuelve un jobExecutionId. GET /trp-tag/print/excel/batch/{id} devuelve el estado.

El progreso se calcula de la siguiente manera:

  • IMPRIMIR: proporcional a writeCount (90% del tiempo).
  • Pasos restantes: 0% o 100%.

El frontend recibe:

  • progressPercentage para la barra de progreso.
  • currentStepNumber/totalStepsNumber.
  • estado (INICIADO/COMPLETADO/FALLADO).
  • downloadUrl.
  • failureDetails.
  • durationMillis.

Beneficios de la Implementación

  • Procesamiento Asíncrono: Respuesta instantánea en lugar de tiempos de espera.
  • Persistencia: Historial almacenado en PostgreSQL sin infraestructura adicional.
  • Integridad Transaccional: Gestión automática del estado, a diferencia de @Async.

Conclusiones Clave

  • Un tamaño de fragmento de 10 minimiza el uso de memoria y garantiza el seguimiento del progreso.
  • WriteCount es un contador incorporado para un monitoreo preciso.
  • ExecutionContext almacena referencias a artefactos.
  • JobExecutionListener garantiza la limpieza.
  • Thread Pool escala múltiples Jobs concurrentemente.

Spring Batch es adecuado para cualquier generación de documentos por lotes con archivado y almacenamiento. La implementación toma menos tiempo que la lógica personalizada con colas.

— Editorial Team

Advertisement 728x90

Leer después