首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring Boot多线程ItemWriter

Spring Boot多线程ItemWriter
EN

Stack Overflow用户
提问于 2021-09-12 06:46:33
回答 1查看 213关注 0票数 1

我有一个Spring Boot批处理作业,它有两个主要步骤,第一个步骤是从电子表格中读取一堆行。第二个是写入数据库。现在,它被设置为串行写入数据库

代码语言:javascript
复制
public CompositeItemWriter<SoftLayerData> compositeSoftlayerDataWriter(
    JpaItemWriter<SoftLayerData> softlayerDataWriter) {
  CompositeItemWriter<SoftLayerData> compositeWriter = new CompositeItemWriter<>();
  compositeWriter.setDelegates(asList(softlayerDataWriter));
  return compositeWriter;
}

问题是体积太大了。由于没有理由维护任何顺序,我希望有多个编写器。我试过这个:

代码语言:javascript
复制
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方法。使用多个编写器的最佳方法是什么?

谢谢,伐木人

EN

回答 1

Stack Overflow用户

发布于 2021-09-13 10:04:14

CompositeItemWriter调用委托编写器是顺序的,而不是并行的。因此,在复合编写器中创建10个JpaItemWriter作为委托不会使您的步骤成为多线程的。

如果您希望该步骤成为多线程的,则需要向其添加一个TaskExecutor,如下所示:

代码语言:javascript
复制
@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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69149100

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档