/ /はバネ一括でネストされたチャンクです - バネ、バネバッチ

バネバッチでネストされたチャンクです - バネ、バネバッチ

こんにちは、私は春のバッチが初めてです。

私は以下のような春のバッチの状況があります:

すべてのプロモーションのバッチを実行する必要があります[プロモーションのリスト]

  • 各プロモーションごとに私はプロモーション属性を持つ動的クエリを準備し、すべてのトランザクション履歴を取得し、各ユーザーにプロモーションポイントを計算する必要があります

    そしてここでは上記の動的クエリを使って、少なくとも50,000レコードの結果を返すので、バッチから再度読みたいと思っていました。

以下は私が期待しているプロセスです、これは春のバッチで可能ですか?

  • プロモーションを読む[リーダーはプロモーションを1つずつ読み込みます]
    • クエリを作成し、それを文脈上に置く
    • それを次のリーダーに渡す
      • リーダはトランザクションを1つずつ読み込みます
      • トランザクションの処理とポイントの計算
    • プロセッサー

ここでの問題は、ネストされたチャンクを書くことができないことです[1つは読書促進のためのもので、もう1つは読書のためのものです]。

一つの選択肢は:

プロモーションごとにジョブを分割します。この場合、すべてのプロモーションは同時に実行されますが、1つずつ実行する必要があります。

どのような体でもこれを示唆することはできますか?

回答:

回答№1は1

ネストされたチャンクを持つことができないので、(擬似コードのように)独自のCompositeItemReaderをコーディングすることができます:

class CompositeItemReader implements ItemReader<Transaction> {
ItemReader<Promotion> promotions;
ItemReader<Transaction> transactions;

public void setPromotions(ItemReader<Promotion> promotions) {...}

public Transaction read() {
Transaction item = transactions.read();
if(null == item) {
Promotion p = promotions.read();
if(null != p) {
// Close transactions reader, create dynamic query and open transaction reader
// Re-read item!
item = this.read();
}
}

return item;
}
}

プロモーションとトランザクションをストリームとして登録し、再始動性を管理することを忘れないでください。
または、各プロモーションに関連付けられた取引のリスト<>が制限されていることが確実な場合は、 ItemProcessor<Promotion,List<Transaction>> 単一のプロモーションを(Driving Query Based ItemReaders)のように変換する:

class PromotionProcessor implements ItemProcessor<Promotion,List<Transaction>> {
public List<Transaction> process(Promotion item) {
Query q = <create dynamic query>;
return q.list();
}
}

説明されているようなPeekableItemReaderとデータホルダに基づくソリューション ここに

この考慮が役立つことを願っています!よくやった!