こんにちは、私は春のバッチが初めてです。
私は以下のような春のバッチの状況があります:
すべてのプロモーションのバッチを実行する必要があります[プロモーションのリスト]
各プロモーションごとに私はプロモーション属性を持つ動的クエリを準備し、すべてのトランザクション履歴を取得し、各ユーザーにプロモーションポイントを計算する必要があります
そしてここでは上記の動的クエリを使って、少なくとも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とデータホルダに基づくソリューション ここに
この考慮が役立つことを願っています!よくやった!