我有一个包含许多项目的清单,我将其分成每个 10 个的块。
但
itemProcessor
只能处理块中的 1 × 1 项。
我如何将每个块中的所有项目聚合到一个列表中,然后调用(包含该列表)外部 API,因为我不希望每 1 个项目有 1 个 API 请求?
@Bean
public Job job(JobBuilderFactory jobs, StepBuilderFactory steps) {
return jobs.get("job")
.start(steps.get("step")
.<Item, Item>chunk(10)
.reader(itemReader())
.processor(itemProcessor())
.writer(itemWriter())
.build())
.build();
}
解决了。
我重新配置 ItemReader 以返回需要处理的“块”
Job.java
@Bean
public Job job(JobBuilderFactory jobs, StepBuilderFactory steps) {
return jobs.get("job")
.start(steps.get("step")
.<List<Item>, List<Item>chunk(1) // Use chunk size of 1, as the reader now returns a chunk
.reader(itemReader())
.processor(itemProcessor())
.writer(itemWriter())
.build())
.build();
}
@Bean
@StepScope
public ItemReader<List<Item>> itemReader() {
// Prepare the items from your data source ...
int chunkSize = 10; // Set your desired chunk size here
return new ChunkItemReader<>(items, chunkSize);
}
ChunkItemReader.java
import org.springframework.batch.item.ItemReader;
import java.util.List;
public class ChunkItemReader<T> implements ItemReader<List<T>> {
private final List<T> items;
private final int chunkSize;
private int currentIndex;
public ChunkItemReader(List<T> items, int chunkSize) {
this.items = items;
this.chunkSize = chunkSize;
this.currentIndex = 0;
}
@Override
public List<T> read() {
int endIndex = Math.min(currentIndex + chunkSize, items.size());
if (currentIndex < endIndex) {
List<T> chunk = items.subList(currentIndex, endIndex);
currentIndex = endIndex;
return chunk;
}
return null; // End of data
}
}