Spring Batch-在读取器处理器和写入器之间传递所有数据

nbp*_*eth 0 java spring batch-processing spring-batch spring-boot

我很好奇一个人如何设法将读者的所有可用数据向下传递到管道中。

例如,我希望读取器提取所有数据并将整个结果集传递给处理器和写入器。结果集很小,我不担心资源。我以为我已经通过使所有组件(读取器,写入器,处理器)接收并返回已处理项目的集合来正确实现了此目的。

虽然该过程的结果看起来不错,但我看到的是该作业正在读取所有内容,将其向下传递到管道中,然后返回给读取器,读取所有内容并将其向下传递,依此类推。

我已经考虑过创建一个额外的步骤来读取所有数据并将其传递给后续步骤,但是我很好奇我是否可以做到这一点以及如何做到

这份工作看起来像

@Bean
Job job() throws Exception {
    return jobs.get("job").start(step1()).build()
}
@Bean
protected Step step1() throws Exception {
    return steps.get("step1").chunk(10)
    .reader(reader()
    .processor(processor()
    .writer(writer()).build()
Run Code Online (Sandbox Code Playgroud)

// ....

读者,处理器和作家接受并返回一个列表,例如

class DomainItemProcessor implements ItemProcessor<List<Domain>, List<Domain>>{
Run Code Online (Sandbox Code Playgroud)

Han*_*ier 5

您也可以将其实现为小任务。由于您想一次处理所有数据,因此您实际上没有批处理功能,因此,完全不会使用“正常” springbatch步骤的整个重新启动和故障处理。

像这样的tasklet在伪代码中可能如下所示:

@Component
public class MyTasklet implements Tasklet {

    @Autowired
    private ItemReader<YourType> readerSpringBeanName;

    @Autowired
    private ItemProcessor<List<YourType>,List<YourType>> processorSpringBeanName;

    @Autwired
    private ItemWriter<List<YourType>> writerSpringBeanName;


    RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) {
        readerSpringBeanName.open(new ExecutionContext());
        writerSpringBeanName.open(new ExecutionContext());

        List<YourType> items = new ArrayList<>();
        YourType readItem = readerSpringBeanName.read();
        while(readItem != null) {
             items.add(readItem);
             readItem = readerSpringBeanName.read();
        }

        writerSpringBeanName.write(processorSpringBeanName.process(items));

        readerSpringBeanName.close();
        writerSpringBeanName.close();
        return RepeatStatus.FINISHED;
    }
}
Run Code Online (Sandbox Code Playgroud)

而且,根据您的用例,可能甚至根本不需要定义spring-batch作业。