Spring Batch AbstractPagingItemReader全量读取后才处理写入问题咨询
问题根因分析
- Chunk配置不匹配:Spring Batch中Reader拉取的记录什么时候触发Processor、Writer执行,由Step配置的
chunk-size决定。你当前应该是将chunk-size设置为了100,所以Reader会攒够100条数据才会往下执行处理写入逻辑,自然会连续拉取10页数据。 - 自定义循环逻辑错误:AbstractPagingItemReader本身内置了分页自动遍历的能力,你额外添加的10次循环拉取逻辑,会导致单次
doReadPage执行就返回全量100条数据,进一步加剧了全量拉取再处理的问题。 - 分页游标未正确维护:你之前不加循环时只执行一次就退出,是因为你没有正确更新父类维护的分页页码,拉完第一页后框架判定没有下一页,所以直接停止读取。
调整方案
- 移除自定义的循环拉取逻辑
你不需要手动写循环调用多次API,只需要重写doReadPage方法,单次方法仅调用一次API拉取当前页的10条数据,同时正确更新分页游标即可,框架会自动判断是否还有下一页,自动触发后续页的拉取。
参考实现:
@Override protected List<User> doReadPage() { // getPage() 是父类提供的当前页码,不需要自己维护累加 ApiPageResult<User> pageResult = remoteUserApi.pageQuery(getPage(), getPageSize()); // 没有下一页时将页码设为负数,通知框架停止读取 setPage(pageResult.hasNext() ? getPage() + 1 : -1); return pageResult.getDataList(); }
- 对齐Chunk大小和分页大小
将对应Step的chunk-size配置为和分页大小一致的10,框架会每次从Reader读取10条数据后,就触发一次Processor和Writer的执行,执行完成后再触发Reader拉取下一页的10条数据,完全符合你读一页处理一页的预期。 - 显式配置读取器分页大小
初始化AbstractPagingItemReader时,显式调用setPageSize(10),保证和chunk-size配置一致即可。
内容的提问来源于stack exchange,提问作者Ankur Saxena
相关产品推荐
相关产品推荐

