是可以在春季批量嵌套的块

时间:2013-08-19 07:38:55

标签: spring spring-batch

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

我有如下弹簧批的情况:

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

运行批次
  • 对于每次促销,我需要使用促销属性准备动态查询,并获取所有交易记录并为每个用户计算促销点

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

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

  • 阅读促销活动[读者逐一阅读促销活动]
    • 创建查询并将其置于上下文
    • 将其传递给下一位读者
      • 读者逐一阅读交易
      • 处理交易和计算点
    • 处理器

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

另一种选择是:

为每个促销分区工作,所有促销活动将同时进行,但我们需要一个接一个地运行。

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

1 个答案:

答案 0 :(得分: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;
  }
}

但请记住将促销和交易注册为流,并记住管理可重启性 或者,如果您确定每个促销活动都有一个有限的列表&lt;&gt;在关联交易中,您可以使用转换单个促销的ItemProcessor<Promotion,List<Transaction>>(基于驾驶查询的项目阅读器):

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

另外一个基于PeekableItemReader和数据持有者的解决方案,如描述here

希望这些考虑对您有所帮助!干得好!