我有一个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 方法。使用多个编写器的最佳方法是什么?
1条答案
按热度按时间r1zk6ea11#
CompositeItemWriter
调用委托编写器是顺序的,而不是并行的,因此在复合编写器中创建10个JpaItemWriter
作为委托不会使您的步骤成为多线程的。如果你想让这个步骤成为多线程的,你需要添加一个
TaskExecutor
,类似于:请参阅多线程步骤。
现在的问题是,您正在使用
new
操作符创建JpaItemWriter
,因此Spring不会调用afterPropertiesSet
方法来检查强制属性,您需要在这个writer上设置一个EntityManagerFactory
。