java - jobbuilderfactory - spring batch processes
Varios escritores de artÃculos en lote de primavera (5)
Actualmente estoy escribiendo un lote de Spring donde estoy leyendo una parte de los datos, procesándolos y luego deseo pasar estos datos a 2 escritores. Un escritor simplemente actualizaría la base de datos mientras que el segundo escritor escribirá en un archivo csv.
Estoy planeando escribir mi propio escritor personalizado e inyectar los dos itemWriters en customItemWriter y llamar a los métodos de escritura de ambos escritores de elementos en el método write de customItemWriter. ¿Es este enfoque correcto? ¿Hay implementaciones de ItemWriter disponibles que cumplan mis requisitos?
Gracias por adelantado
Configuración de Java de manera SpringBatch4
@Bean
public Step step1() {
return this.stepBuilderFactory.get("step1")
.<String, String>chunk(2)
.reader(itemReader())
.writer(compositeItemWriter())
.stream(fileItemWriter1())
.stream(fileItemWriter2())
.build();
}
/**
* In Spring Batch 4, the CompositeItemWriter implements ItemStream so this isn''t
* necessary, but used for an example.
*/
@Bean
public CompositeItemWriter compositeItemWriter() {
List<ItemWriter> writers = new ArrayList<>(2);
writers.add(fileItemWriter1());
writers.add(fileItemWriter2());
CompositeItemWriter itemWriter = new CompositeItemWriter();
itemWriter.setDelegates(writers);
return itemWriter;
}
Dependiendo de su necesidad, otra opción es extender la clase Writer y agregar funcionalidad allí. Por ejemplo, tengo un proyecto donde extiendo HibernateItemWriter y luego sobrescribo la escritura (elementos de la lista). Luego, envío los objetos que estoy escribiendo junto con mi sessionFactory al método doWrite del escritor: doWrite (sessionFactory, filtrados).
Entonces, en el ejemplo anterior, podría escribir en el archivo csv en mi clase extendida y luego HibernateItemWriter escribiría en la base de datos. Obviamente, esto podría no ser ideal para este ejemplo, pero para ciertos escenarios es una buena opción.
No necesariamente tienes que usar xml como el ejemplo. Si el resto de su código usa anotación, simplemente puede hacer lo siguiente.
public ItemWriter<T> writerOne(){
ItemWriter<T> writer = new ItemWriter<T>();
//your logic here
return writer;
}
public ItemWriter<T> writerTwo(){
ItemWriter<T> writer = new ItemWriter<T>();
//your logic here
return writer;
}
public CompositeItemWriter<T> compositeItemWriter(){
CompositeItemWriter writer = new CompositeItemWriter();
writer.setDelegates(Arrays.asList(writerOne(),writerTwo()));
return writer;
}
Usted tenía razón. SB se basa principalmente en la delegación, por lo que usar un CompositeItemWriter es la opción correcta para sus necesidades.
Puede utilizar Spring''s CompositeItemWriter y delegar a todos sus escritores.
Aquí hay un ejemplo de configuración .