首页 文章

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

提问于
浏览
0

嗨,我是 Spring 季批次新手 .

我有如下 spring 批的情况:

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

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

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

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

  • 阅读促销活动[读者逐一阅读促销活动]

  • 创建查询并将其放在上下文中

  • 将其传递给下一位读者

  • 阅读器逐个读取事务

  • 处理交易和计算点数

  • 处理器

我的问题是不能写嵌套块[一个用于读取促销,一个用于读取事务] .

一种选择是:

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

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

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>> 转换单个促销(如基于驾驶查询的ItemReaders):

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

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

    希望这些考虑可能有所帮助!做得好!

相关问题