本文介紹了ItemWriter的Spring Boot多線程的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我有一個Spring Boot批處理作業,它包含兩個主要步驟,第一個步驟從電子表格中讀取一串行。第二個寫入數據庫?,F在,它已設置為串行寫入數據庫
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多線程的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,