> ## Documentation Index
> Fetch the complete documentation index at: https://alan-ramirez-dev.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# ⚡ Ingesta Asíncrona

> Arquitectura del motor de procesamiento masivo con Hilos Virtuales y Spring Batch.

El núcleo del **Pipeline** está diseñado para procesar archivos de telemetría logística masivos de forma asíncrona. La arquitectura desacopla la recepción HTTP del procesamiento pesado de I/O, garantizando la disponibilidad del servicio.

## 🧵 Concurrencia con Hilos Virtuales (Java 21)

Para evitar el agotamiento de los hilos físicos del servidor durante cargas pesadas, el Pipeline de Spring Batch delega la ejecución concurrente a un executor respaldado por hilos virtuales nativos de Java 21.

```java theme={null}
// Configuración en BatchConfig.java
@Bean
public TaskExecutor taskExecutor() {
    return new TaskExecutorAdapter(Executors.newVirtualThreadPerTaskExecutor());
}
```

## 📦 Procesamiento por Lotes y Bulk Inserts

Para lograr un alto rendimiento en la base de datos sin saturar la memoria RAM del contenedor, el proceso de escritura combina las capacidades nativas de Spring Batch con el JDBC Batching de Hibernate y PostgreSQL.

### 🎯 Tamaño de Chunk Estratégico

El `Step` de importación está configurado para leer, procesar y escribir en lotes (chunks) de **500 registros** a la vez.

```java theme={null}
// Configuración del Chunk en BatchConfig.java
@Bean
public Step importTelemetryStep(...) {
    return new StepBuilder("importTelemetryStep", jobRepository)
            .<TelemetryCsvRecord, LogiflowTelemetry>chunk(500, transactionManager)
            // ...
            .build();
}
```

## 🛡️ Resiliencia y Tolerancia a Fallos (Fault-Tolerant)

Un aspecto crítico en la ingesta masiva de datos externos es la resiliencia ante archivos corruptos o filas mal formadas. El pipeline está configurado bajo una política estricta de omisión tolerante a fallos (`faultTolerant`).

Si el lector detecta un error de parseo o una excepción inesperada en una fila, el motor aísla el registro, incrementa el contador de omisiones y continúa procesando el resto del archivo sin interrumpir la transacción del lote completo, soportando un límite máximo de hasta 500 exclusiones.

```java theme={null}
// Configuración de tolerancia a fallos en BatchConfig.java
.faultTolerant()
.skip(FlatFileParseException.class)
.skip(Exception.class)
.skipLimit(500)
```
