gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 16:51:33 25 4
gpt4 key购买 nike

我很好奇如何将读取器中的所有可用数据通过管道向下传递。

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

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

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

工作看起来像

@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()

//...

读取器、处理器和写入器接受并返回一个列表,例如

class DomainItemProcessor implements ItemProcessor<List<Domain>, List<Domain>>{

最佳答案

您还可以将其实现为一个tasklet。由于您想要一次处理所有数据,因此您实际上并没有批处理,因此,根本不会使用“正常”springbatch 步骤的整个重新启动和故障处理。

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

@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;
}
}

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

关于java - Spring Batch - 在读取器处理器和写入器之间传递所有数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39113361/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com