Multi-itemwriters in Spring batch
j'écris actuellement un lot de printemps où je suis en train de lire un morceau de données, de les traiter et puis je souhaite transmettre ces données à 2 rédacteurs. Un rédacteur mettrait simplement à jour la base de données tandis que le second écrirait dans un fichier csv.
j'ai l'intention d'écrire mon propre écrivain et injecter les deux itemWriters dans le customItemWriter et d'appeler les méthodes d'écriture de l'article écrivains dans la méthode d'écriture de customItemWriter. Cette approche est-elle correcte? Il n'existe aucun Les implémentations ItemWriter disponibles qui répondent à mes exigences?
Merci d'avance
5 réponses
Vous pouvez utiliser le Printemps CompositeItemWriter et délégué à les auteurs.
voici un exemple de configuration.
Vous n'avez pas nécessairement besoin d'utiliser xml comme dans l'exemple. Si le reste de votre code utilise l'annotation, vous pouvez simplement faire ce qui suit.
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;
}
Vous avez eu raison. SB est fortement basé sur la délégation donc en utilisant un CompositeItemWriter est le bon choix pour vos besoins.
selon vos besoins, une autre option est d'étendre la classe Writer et d'y ajouter des fonctionnalités. Par exemple, j'ai un projet où je vais étendre HibernateItemWriter et puis passer en écriture(liste des éléments). J'envoie ensuite les objets que j'écris avec mon répertoire sessionFactory à la méthode doWrite de L'écrivain: doWrite(sessionFactory, filteredRecords).
donc dans l'exemple ci-dessus, je pourrais écrire dans le fichier csv dans ma classe étendue et alors le HibernateItemWriter écrire dans la base de données. Ce n'est évidemment pas idéal pour cet exemple, mais pour certains scénarios, c'est une bonne option.
Java Config way 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;
}