
本文介绍如何在 Spring Batch 中将原始数据按指定大小(如每 10 条)分块,使 ItemProcessor 接收整个列表而非单个对象,从而合并调用外部 API,显著降低请求频次并提升批处理效率。
本文介绍如何在 spring batch 中将原始数据按指定大小(如每 10 条)分块,使 `itemprocessor` 接收整个列表而非单个对象,从而合并调用外部 api,显著降低请求频次并提升批处理效率。
在标准 Spring Batch 流程中,chunk(10) 表示每次读取 10 条记录、逐条经 ItemProcessor 处理、再批量写入。但若业务逻辑需对整批数据统一调用一次外部服务(例如批量校验、批量同步或批量推送),逐条处理不仅低效,还可能触发限流或增加网络开销。
核心思路是:将“分块逻辑”前移至 ItemReader 层——让 Reader 直接返回 List<item></item> 类型的“数据块”,而非单个 Item;相应地,将 chunk size 设为 1(因为每个“项”现在就是一个 chunk 列表),从而驱动 Processor 和 Writer 基于整批数据工作。
以下是关键实现步骤:
✅ 1. 配置 Job:使用 chunk(1) 并声明泛型为 List<item></item>
@Bean
public Job job(JobBuilderFactory jobs, StepBuilderFactory steps) {
return jobs.get("batchJob")
.start(steps.get("processChunkStep")
.<list>, List<item>>chunk(1) // 每次处理一个「块」(即 List<item>)
.reader(itemReader())
.processor(itemProcessor())
.writer(itemWriter())
.build())
.build();
}</item></item></list>
✅ 2. 自定义 ItemReader<list>></list> 实现分块读取
@Bean
@StepScope
public ItemReader<list>> itemReader() {
List<item> allItems = fetchDataFromSource(); // 替换为你的实际数据源(DB、文件、API等)
int chunkSize = 10;
return new ChunkItemReader(allItems, chunkSize);
}</item></list>
✅ 3. 编写 ChunkItemReader —— 按需切片返回
public class ChunkItemReader<t> implements ItemReader<list>> {
private final List<t> items;
private final int chunkSize;
private int currentIndex = 0;
public ChunkItemReader(List<t> items, int chunkSize) {
this.items = Collections.unmodifiableList(items);
this.chunkSize = chunkSize;
}
@Override
public List<t> read() {
if (currentIndex >= items.size()) {
return null; // 数据耗尽
}
int endIndex = Math.min(currentIndex + chunkSize, items.size());
List<t> chunk = items.subList(currentIndex, endIndex);
currentIndex = endIndex;
return new ArrayList(chunk); // 返回新实例,避免后续修改影响
}
}</t></t></t></t></list></t>
⚠️ 注意事项:
subList()返回的是原列表的视图,务必通过new ArrayList(...)包装,防止在 Processor 或 Writer 中意外修改原始数据;- 若数据源极大(如百万级),不建议一次性加载全部
items到内存,应改用分页查询 + 游标式ItemReader(如JdbcPagingItemReader)配合自定义分块逻辑;ItemProcessor签名需同步更新为ItemProcessor<list>, List<item>></item></list>,可在此完成批量 API 调用与结果映射;- Writer 同理应适配
ItemWriter<list>></list>,支持批量入库或响应处理。
通过该设计,你真正实现了「以 chunk 为单位的端到端批量处理」,既符合 Spring Batch 的扩展模型,又兼顾了高性能与可维护性。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










