嗨,我是春季批次的新手。
我有如下弹簧批的情况:
我需要为所有促销[促销列表]
运行批次对于每次促销,我需要使用促销属性准备动态查询,并获取所有交易记录并为每个用户计算促销点
这里有上面的动态查询,我想再次从批处理中读取,因为它返回最少5万条记录的结果。
下面是我期待的过程,春季批次是否可行?
我的问题是无法编写嵌套块[一个用于读取促销,一个用于读取事务]。
另一种选择是:
为每个促销分区工作,所有促销活动将同时进行,但我们需要一个接一个地运行。
任何机构都可以为此提出任何建议吗?
答案 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
希望这些考虑对您有所帮助!干得好!