現在、データのチャンクを読み取って処理しているSpringバッチを作成しています。このデータを2人のライターに渡したいと思っています。 1人のライターは単にデータベースを更新するのに対して、2人目のライターはcsvファイルに書き込みます。
独自のカスタムライターを作成し、customItemWriterに2つのitemWriterを挿入し、customItemWriterのwriteメソッドで両方のアイテムライターのwriteメソッドを呼び出す予定です。このアプローチは正しいですか?要件を満たすItemWriter実装はありますか?
前もって感謝します
Springの CompositeItemWriter を使用して、すべてのライターに委任できます。
これは 設定例 です。
例のように必ずしもxmlを使用する必要はありません。コードの残りの部分で注釈が使用されている場合は、次のようにするだけで済みます。
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;
}
君は正しかった。 SBは委任に大きく基づいているため、 CompositeItemWriter を使用することが適切です。
Java Configの方法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;
}
必要に応じて、別のオプションとしてWriterクラスを拡張し、そこに機能を追加します。たとえば、HibernateItemWriterを拡張してからwrite(List items)をオーバーライドするプロジェクトがあります。次に、書きたいオブジェクトをsessionFactoryとともに、WriterのdoWriteメソッドに送信します:doWrite(sessionFactory、filteredRecords)。
したがって、上記の例では、拡張クラスのcsvファイルに書き込むことができ、HibernateItemWriterはデータベースに書き込みます。明らかにこれはこの例には理想的ではないかもしれませんが、特定のシナリオではニースのオプションです。