Spring Boot Multiple threads for ItemWriter(ItemWriter的Spring Boot多线程)
问题描述
我有一个Spring Boot批处理作业,它包含两个主要步骤,第一个步骤从电子表格中读取一串行。第二个写入数据库。现在,它已设置为串行写入数据库
public CompositeItemWriter<SoftLayerData> compositeSoftlayerDataWriter(
JpaItemWriter<SoftLayerData> softlayerDataWriter) {
CompositeItemWriter<SoftLayerData> compositeWriter = new CompositeItemWriter<>();
compositeWriter.setDelegates(asList(softlayerDataWriter));
return compositeWriter;
}
问题是体积太大。既然没有理由维持任何秩序,我希望有多个作家。我尝试过这个:
final int writerCount = 10;
List<ItemWriter<? super SoftLayerData>> writers = new ArrayList<>(writerCount);
for(int counter=0;counter<writerCount;counter++) {
writers.add(new JpaItemWriter<SoftLayerData>());
}
CompositeItemWriter<SoftLayerData> result = new CompositeItemWriter<>();
result.setDelegates(writers);
return result;
但是我收到一个IllegalArgumentException: No EntityManagerFactory specified
。
我喜欢这种方法,但我怀疑我必须遵循一些非常复杂的Spring Boot方法。处理多个写入者的最佳方法是什么?
谢谢, 伐木工
推荐答案
CompositeItemWriter
调用委托编写器是顺序的,而不是并行的。因此,在复合编写器中创建10个JpaItemWriter
作为委派不会使您的步骤成为多线程。
如果希望该步骤成为多线程,则需要向其添加TaskExecutor
,类似于:
@Bean
public TaskExecutor taskExecutor() {
return new SimpleAsyncTaskExecutor("spring_batch");
}
@Bean
public Step sampleStep(TaskExecutor taskExecutor) {
return this.stepBuilderFactory.get("sampleStep")
.<String, String>chunk(10)
.reader(itemReader())
.writer(itemWriter())
.taskExecutor(taskExecutor)
.build();
}
请参考Multi-Threaded step。
现在您的问题是使用new
运算符创建JpaItemWriter
,因此Spring不会调用afterPropertiesSet
方法来检查强制属性。您需要在此编写器上设置EntityManagerFactory
。
这篇关于ItemWriter的Spring Boot多线程的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:ItemWriter的Spring Boot多线程
基础教程推荐
- 如何对 HashSet 进行排序? 2022-01-01
- 如何使用 Eclipse 检查调试符号状态? 2022-01-01
- 如何使用 Stream 在集合中拆分奇数和偶数以及两者的总和 2022-01-01
- Spring Boot Freemarker从2.2.0升级失败 2022-01-01
- 首次使用 Hadoop,MapReduce Job 不运行 Reduce Phase 2022-01-01
- Java 中保存最后 N 个元素的大小受限队列 2022-01-01
- 如何在不安装整个 WTP 包的情况下将 Tomcat 8 添加到 Eclipse Kepler 2022-01-01
- 如何强制对超级方法进行多态调用? 2022-01-01
- 由于对所需库 rt.jar 的限制,对类的访问限制? 2022-01-01
- 在螺旋中写一个字符串 2022-01-01