30

Spring バッチでは、ItemReader によって読み取られたアイテムを 2 つの異なるプロセッサとライターに渡す必要があります。私が達成しようとしているのは...

                        +---> ItemProcessor#1 ---> ItemWriter#1
                        | |
ItemReader ---> アイテム ---+
                        | |
                        +---> ItemProcessor#2 ---> ItemWriter#2

これが必要なのは、ItemWriter#1 によって書き込まれた項目は、ItemWriter#2 によって書き込まれた項目とはまったく異なる方法で処理する必要があるためです。さらに、ItemReader はデータベースから項目を読み取りますが、実行するクエリは計算コストが非常に高いため、同じクエリを 2 回実行するのは破棄する必要があります。

そのような設定を達成する方法についてのヒントはありますか? または、少なくとも、論理的に同等のセットアップですか?

4

5 に答える 5

14

この解決策は、商品を処理業者 1 と処理業者 2 で処理する必要がある場合に有効です。

この署名でプロセッサ #0 を作成する必要があります。

class Processor0<Item, CompositeResultBean>

CompositeResultBeanBean は次のように定義されます。

class CompositeResultBean {
  Processor1ResultBean result1;
  Processor2ResultBean result2;
}

プロセッサ #0 では、作業をプロセッサ #1 と #2 に委譲し、結果をCompositeResultBean

CompositeResultBean Processor0.process(Item item) {
  final CompositeResultBean r = new CompositeResultBean();
  r.setResult1(processor1.process(item));
  r.setResult2(processor2.process(item));
  return r;
}

あなた自身のライターはライターCompositeItemWriterに委任されているCompositeResultBean.result1か、またはCompositeResultBean.result2PropertyExtractingDelegatingItemWriterを見てください。おそらく役立つでしょう)

于 2013-09-25T09:38:46.357 に答える
3

CompositeItemProcessorとを使用できますCompositeItemWriter

スキーマとまったく同じようには見えませんが、シーケンシャルになりますが、機能します。

于 2013-09-25T09:34:49.230 に答える
0

合理的な量のアイテム (1 Go 未満など) がある場合は、別の解決策があります。選択の結果を、Spring Bean にラップされたコレクションにキャッシュできます。

その後、無料でコレクションを 2 回読むことができます。

于 2015-04-24T07:52:34.830 に答える