Cómo registrar los nombres de archivos que se procesaron exitosamente.
Tengo una aplicación de Spring Batch donde estoy procesando múltiples archivos .txt
en paralelo. Mi configuración de trabajo simple se ve de la siguiente manera:
@Value("file:input/*.txt")
private Resource[] inputResources;
@Bean("partitioner")
@StepScope
public Partitioner partitioner() {
log.info("En Partitioner");
MultiResourcePartitioner partitioner = new MultiResourcePartitioner();
partitioner.setResources(inputResources);
partitioner.partition(10);
return partitioner;
}
@Bean
@StepScope
@Qualifier("nodeItemReader")
@DependsOn("partitioner")
public FlatFileItemReader NodeItemReader(@Value("#{stepExecutionContext['fileName']}") String filename)
throws MalformedURLException {
return new FlatFileItemReaderBuilder().name("NodeItemReader").delimited().delimiter("<##>")
.names(new String[] { "id" }).fieldSetMapper(new BeanWrapperFieldSetMapper() {
{
setTargetType(FolderNodePojo.class);
}
}).linesToSkip(0).resource(new UrlResource(filename)).build();
}
Hay miles de archivos .txt
con miles de líneas que se están procesando. Algunos archivos tienen datos corruptos y el trabajo falla. Necesito generar y enviar un informe sobre los nombres de los archivos que tienen datos corruptos.
¿Qué debo hacer para registrar el nombre de los archivos que se procesaron correctamente para todas sus líneas, o, si es posible, si puedo registrar los que no fueron exitosos, eso también será de ayuda? Para poder generar un informe basado en eso y también cuando vuelva a comenzar el trabajo, pueda eliminar aquellos que fueron exitosos del directorio input
. Cualquier sugerencia/solución será muy apreciada.
davy.ai
Para registrar el nombre de los archivos que se procesaron correctamente, puedes escribir un
ItemWriteListener
y unStepExecutionListener
personalizados.El
ItemWriteListener
tendrá dos métodos:onWriteError
– Este método se llamará cuando ocurra un error al escribir un elemento. En este método, puedes registrar el nombre del archivo y cualquier otra información relevante que desees incluir en el informe.afterWrite
– Este método se llamará después de una escritura exitosa. En este método, puedes registrar el nombre del archivo y cualquier otra información relevante que desees incluir en el informe.El
StepExecutionListener
tendrá dos métodos:beforeStep
– Este método se llamará antes de que comience el paso. En este método, puedes usar elExecutionContext
para almacenar los nombres de los archivos procesados.afterStep
– Este método se llamará después de que finalice el paso. En este método, puedes recuperar los nombres de los archivos procesados delExecutionContext
y eliminarlos del directorio de entrada.Aquí tienes un código de ejemplo que muestra cómo implementar el
ItemWriteListener
y elStepExecutionListener
:Debes registrar el listener en tu paso. Así es cómo puedes agregar el listener a tu paso:
Con esta implementación, tendrás una lista de archivos procesados que podrás utilizar para generar el informe y eliminar los archivos que se procesaron correctamente.</foldernodepojo,>