0

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

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

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

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

    そして、ここで上記の動的クエリを使用して、バッチから再度読み取りたいと思っていました。これは、最小で 50,000 レコードの結果が返されるためです。

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

  • プロモーションを読む[リーダーがプロモーションを 1 つずつ読む]
    • クエリを作成してコンテキストに配置する
    • 次の読者に渡す
      • リーダーはトランザクションを 1 つずつ読み取ります
      • 取引の処理とポイントの計算
    • プロセッサー

ここでの私の問題は、ネストされたチャンク [読み取りプロモーション用とトランザクション読み取り用] を書き込めないことです。

1つの選択肢は次のとおりです。

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

これについて何らかの方法を提案できる体はありますか?

4

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;
  }
}

ただし、プロモーションとトランザクションをストリームとして登録し、再起動可能性を管理することを忘れないでください。
または、各プロモーションに関連付けられたトランザクションの List<> が限られていることが確実な場合は、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 とデータホルダーに基づくソリューション

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

于 2013-08-19T13:15:34.617 に答える