J'écris actuellement un lot de printemps où je lis un bloc de données, je le traite puis je souhaite transmettre ces données à 2 rédacteurs. Un auteur mettrait simplement à jour la base de données tandis que le second écrivait dans un fichier csv.
Je prévois d'écrire mon propre écrivain personnalisé et d'injecter les deux itemWriters dans le customItemWriter et d'appeler les méthodes d'écriture des deux rédacteurs d'élément dans la méthode write de customItemWriter. Cette approche est-elle correcte? Existe-t-il des implémentations ItemWriter disponibles qui répondent à mes exigences?
Merci d'avance
Vous pouvez utiliser le CompositeItemWriter de Spring et y déléguer tous vos rédacteurs.
voici un exemple de configuration .
Vous ne devez pas nécessairement utiliser XML comme dans l'exemple. Si le reste de votre code utilise des annotations, vous pouvez simplement procéder comme 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;
}
Tu avais raison. SB étant basé sur la délégation, l’utilisation de CompositeItemWriter est le bon choix pour vos besoins.
Méthode de configuration Java 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;
}
En fonction de vos besoins, une autre option consiste à étendre la classe Writer et à y ajouter des fonctionnalités. Par exemple, j'ai un projet dans lequel j'étends HibernateItemWriter, puis je remplace l'écriture (éléments de la liste). J'envoie ensuite les objets que j'écris avec ma sessionFactory à la méthode doWrite du Writer: doWrite (sessionFactory, filterRecords).
Ainsi, dans l'exemple ci-dessus, je pourrais écrire dans le fichier csv de ma classe étendue, puis HibernateItemWriter écrira dans la base de données. Évidemment, cela pourrait ne pas être idéal pour cet exemple, mais pour certains scénarios, il s'agit d'une option intéressante.