spring批处理中是否可以嵌套块

spring批处理中是否可以嵌套块,spring,spring-batch,Spring,Spring Batch,嗨,我是新来的春天批 我对spring批次的情况如下: 我需要为所有促销[促销列表]运行批处理 对于每个促销,我需要准备带有促销属性的动态查询,获取所有交易历史记录,并计算每个用户的促销点数 在这里,我想再次从批处理中读取上面的动态查询,因为它返回至少50000条记录的结果 以下是我所期待的过程,这在春季批次中是否可行 阅读促销[读者逐个阅读促销] 创建查询并将其置于上下文中 将其传递给下一个读者 读卡器逐个读取事务 处理交易并计算积分 处理机 我这里的问题是无法写入嵌套块[一个

嗨,我是新来的春天批

我对spring批次的情况如下:

我需要为所有促销[促销列表]运行批处理

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

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

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

  • 阅读促销[读者逐个阅读促销]
    • 创建查询并将其置于上下文中
    • 将其传递给下一个读者
      • 读卡器逐个读取事务
      • 处理交易并计算积分
    • 处理机
我这里的问题是无法写入嵌套块[一个用于读取提升,一个用于读取事务]

一种选择是:

为每个促销划分作业,在这种情况下,所有促销将同时运行,但我们需要一个接一个地运行


任何主体都可以对此提出建议吗?

您不能使用嵌套块,这样您就可以编写自己的CompositeItemReader(伪代码):

类CompositeItemReader实现ItemReader{
项目阅读器促销;
项目阅读器事务;
公共无效集合促销(ItemReader促销){…}
公共事务读取(){
事务项=事务。读取();
if(null==项){
Promotion p=promotions.read();
if(null!=p){
//关闭事务读取器、创建动态查询和打开事务读取器
//重读该项目!
item=this.read();
}
}
退货项目;
}
}
但请记住将促销和交易注册为流,并记住管理可重启性。
或者,如果您确定每个促销都有有限的关联事务列表,则可以使用
ItemProcessor
转换单个促销,如(驱动基于查询的itemreader):

class PromotionProcessor实现ItemProcessor{
公开列表流程(促销项目){
查询q=;
返回q.list();
}
}
还有一个基于PeekableItemReader和data holder的解决方案,如所述


希望这些考虑可以有所帮助!干得好

你找到另一个解决办法了吗?我感兴趣是因为,在不久的将来,我将面临同样的问题
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;
  }
}
class PromotionProcessor implements ItemProcessor<Promotion,List<Transaction>> {
  public List<Transaction> process(Promotion item) {
    Query q = <create dynamic query>;
    return q.list();
  }
}