Spring Batch ItemReader分页实现:从API接口按页读取数据是否可行?
Spring Batch 分页读取API数据实现方案
这个需求完全可以实现,Spring Batch 原生支持分页读取扩展,只需要自定义适配API的分页阅读器即可匹配你要求的「每页拉取10条、完成处理写入后再拉取下一页」的逻辑。
核心实现步骤
- 自定义分页阅读器,继承
AbstractPagingItemReader<T>抽象类,重写doReadPage()方法实现API拉取逻辑:- 方法内会自动获取当前页码,拼接页码、每页条数(设为10)到API请求参数中
- 调用远程API拿到当前页的10条数据,解析后赋值给阅读器的结果列表即可
- 当API返回空列表时,阅读器会自动终止读取流程
- Step配置时将
chunkSize设置为10,和分页拉取的单页条数保持一致,即可实现每读取10条数据触发一次批量处理、写入操作,执行完成后自动拉取下一页的10条数据。
核心代码示例
public class ApiPagingItemReader<T> extends AbstractPagingItemReader<T> { private final RestTemplate restTemplate; private final String apiUrl; // 构造方法注入依赖 public ApiPagingItemReader(RestTemplate restTemplate, String apiUrl) { setPageSize(10); // 固定单页拉取10条 this.restTemplate = restTemplate; this.apiUrl = apiUrl; } @Override protected void doReadPage() { // 初始化结果列表 if (results == null) { results = new ArrayList<>(); } else { results.clear(); } // 拼接分页参数,getPage()返回当前页码,默认从0开始计数 String requestUrl = String.format("%s?pageNum=%d&pageSize=%d", apiUrl, getPage(), getPageSize()); // 调用API获取数据,可根据实际API返回结构调整解析逻辑 ResponseEntity<List<T>> res = restTemplate.exchange( requestUrl, HttpMethod.GET, null, new ParameterizedTypeReference<List<T>>() {} ); if (res.getBody() != null) { results.addAll(res.getBody()); } } @Override protected void doJumpToPage(int itemIndex) { // 若不需要任务失败后跳转到指定页的容错能力,该方法可留空 } }
补充说明
如果API需要鉴权、签名、特殊参数格式要求,只需要在doReadPage方法内调整请求构造逻辑即可,不需要修改Spring Batch的批量处理流程。
内容的提问来源于stack exchange,提问作者Ankur Saxena
相关产品推荐
相关产品推荐

