Spring Boot ItemWriter的多个线程

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

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:没有EntityManagerFactory指定。

我喜欢这种方法,但我怀疑有一些非常复杂的Spring Boot方式我必须遵循。多作家合作的最佳方法是什么?

谢谢

樵夫

# # #CompositeItemWriter calls del调用委托编写器是顺序的,而不是并行的。所以创建10JpaItemWriters as delegates in the composite writer won't make your step multi-thS作为复合编写器中的委托不会使你的步骤多线程化。

如果你想让这个步骤变成多线程的,你需要添加一个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();
}

请参考多线程步骤。

现在的问题是,您正在使用新操作符创建一个JpaItemWriter,因此Spring没有调用afterPropertiesSet方法来检查强制属性。您需要在这个编写器上设置一个EntityManagerFactory。

阅读全文

▼ 版权说明

相关文章也很精彩
推荐内容
更多标签
相关热门
全站排行
随便看看

错说 cuoshuo.com —— 程序员的报错记录

部分内容根据CC版权协议转载;网站内容仅供参考,生产环境使用务必查阅官方文档

辽ICP备19011660号-5

×

扫码关注公众号:职场神器
发送: 1
获取永久解锁本站全部文章的验证码