java ItemWriter的多个线程

62lalag4  于 2023-02-02  发布在  Java
关注(0)|答案(1)|浏览(138)

我有一个Sping 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: No EntityManagerFactory specified
我喜欢这种方法,但我怀疑我必须遵循一些非常复杂的Sping Boot 方法。使用多个编写器的最佳方法是什么?

r1zk6ea1

r1zk6ea11#

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();
}

请参阅多线程步骤。
现在的问题是,您正在使用new操作符创建JpaItemWriter,因此Spring不会调用afterPropertiesSet方法来检查强制属性,您需要在这个writer上设置一个EntityManagerFactory

相关问题