0

嗨,我是春季批次的新手。

我的春季批次情况如下:

我需要为所有促销活动[促销列表]

  • 对于每个促销,我需要准备带有促销属性的动态查询,并获取所有交易历史记录并计算每个用户的促销积分

    在这里,我想从批处理中再次读取上述动态查询,因为它返回的结果最少为 50,000 条记录。

下面是我期待的过程,这在春季批次中是否可行?

  • 阅读促销[读者一一阅读促销]
    • 创建查询并将其放在上下文中
    • 传给下一位读者
      • 读者一一读取交易
      • 处理交易并计算积分
    • 处理器

我的问题是无法写入嵌套块[一个用于读取促销,一个用于读取事务]。

一种选择是:

为每个 Promotion 分区作业,在此所有 Promotions 将同时运行,但我们需要一个接一个地运行。

任何机构都可以为此提出任何建议吗?

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

但请记住将促销和交易注册为流,并记住管理可重启性。
或者,如果您确定每个 Promotion 都有一个有限的 List<> 关联交易,您可以使用ItemProcessor<Promotion,List<Transaction>>转换单个 Promotion 的 a,例如(驱动基于查询的 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 回答