web-dev-qa-db-ja.com

Springバッチの複数のアイテムライター

現在、データのチャンクを読み取って処理しているSpringバッチを作成しています。このデータを2人のライターに渡したいと思っています。 1人のライターは単にデータベースを更新するのに対して、2人目のライターはcsvファイルに書き込みます。

独自のカスタムライターを作成し、customItemWriterに2つのitemWriterを挿入し、customItemWriterのwriteメソッドで両方のアイテムライターのwriteメソッドを呼び出す予定です。このアプローチは正しいですか?要件を満たすItemWriter実装はありますか?

前もって感謝します

24
Pratik Shelar

Springの CompositeItemWriter を使用して、すべてのライターに委任できます。
これは 設定例 です。

18

例のように必ずしも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;
}
12
Yilei

君は正しかった。 SBは委任に大きく基づいているため、 CompositeItemWriter を使用することが適切です。

2

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;
    }
1
Niraj Sonawane

必要に応じて、別のオプションとしてWriterクラスを拡張し、そこに機能を追加します。たとえば、HibernateItemWriterを拡張してからwrite(List items)をオーバーライドするプロジェクトがあります。次に、書きたいオブジェクトをsessionFactoryとともに、WriterのdoWriteメソッドに送信します:doWrite(sessionFactory、filteredRecords)。

したがって、上記の例では、拡張クラスのcsvファイルに書き込むことができ、HibernateItemWriterはデータベースに書き込みます。明らかにこれはこの例には理想的ではないかもしれませんが、特定のシナリオではニースのオプションです。

0
MattC