Spring 批处理 - 一次处理多个项目的子集

问题描述 投票:0回答:1

我有一个包含许多项目的清单,我将其分成每个 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();
}
java spring spring-batch
1个回答
0
投票

解决了。
我重新配置 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
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.