You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 09:36:03