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