Ejemplo completo de un Job en Spring Batch
Este ejemplo muestra cómo implementar un Job en Spring Batch que lee ventas desde PostgreSQL y genera un archivo CSV con el resumen diario.
Estructura de paquetes
src/main/java/com/tuempresa/ventasbatch/
│
├── config/BatchConfig.java
├── job/VentasJobConfig.java
├── reader/VentasItemReader.java
├── processor/VentasItemProcessor.java
├── writer/VentasItemWriter.java
└── model/Venta.java
Código de ejemplo
Entidad del dominio
public class Venta {
private Long id;
private Long restaurantId;
private BigDecimal total;
private LocalDateTime fechaHora;
// getters y setters
}
ItemReader (lectura desde PostgreSQL)
public class VentasItemReader extends JdbcCursorItemReader<Venta> {
public VentasItemReader(DataSource dataSource) {
setDataSource(dataSource);
setSql("SELECT id, restaurant_id, total, fecha_hora FROM ventas WHERE fecha_hora::date = CURRENT_DATE");
setRowMapper((rs, rowNum) -> {
Venta v = new Venta();
v.setId(rs.getLong("id"));
v.setRestaurantId(rs.getLong("restaurant_id"));
v.setTotal(rs.getBigDecimal("total"));
v.setFechaHora(rs.getTimestamp("fecha_hora").toLocalDateTime());
return v;
});
}
}
ItemProcessor (transformación)
public class VentasItemProcessor implements ItemProcessor<Venta, String> {
@Override
public String process(Venta venta) {
return venta.getId() + "," +
venta.getRestaurantId() + "," +
venta.getTotal() + "," +
venta.getFechaHora();
}
}
ItemWriter (escribir CSV)
public class VentasItemWriter extends FlatFileItemWriter<String> {
public VentasItemWriter() {
setResource(new FileSystemResource("reportes/ventas_diarias.csv"));
setLineAggregator(new PassThroughLineAggregator<>());
}
}
Configuración del Job
@Configuration
@EnableBatchProcessing
public class VentasJobConfig {
@Bean
public VentasItemReader reader(DataSource dataSource) {
return new VentasItemReader(dataSource);
}
@Bean
public VentasItemProcessor processor() {
return new VentasItemProcessor();
}
@Bean
public VentasItemWriter writer() {
return new VentasItemWriter();
}
@Bean
public Step ventasStep(StepBuilderFactory stepBuilderFactory,
VentasItemReader reader,
VentasItemProcessor processor,
VentasItemWriter writer) {
return stepBuilderFactory.get("ventasStep")
.<Venta, String>chunk(10)
.reader(reader)
.processor(processor)
.writer(writer)
.build();
}
@Bean
public Job ventasJob(JobBuilderFactory jobBuilderFactory, Step ventasStep) {
return jobBuilderFactory.get("ventasJob")
.start(ventasStep)
.build();
}
}
Resultado
- Lee las ventas del día desde PostgreSQL.
- Transforma cada registro en una línea CSV.
- Escribe el archivo
ventas_diarias.csven la carpetareportes/.
Buenas prácticas
- Configurar retry/skip para manejar errores.
- Integrar con @Scheduled para ejecutar automáticamente cada noche.
- Monitorear con JobRepository para saber qué jobs fallaron o completaron.