本文介紹了ItemWriter的Spring Boot多線程的處理方法,對(duì)大家解決問題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧!
問題描述
我有一個(gè)Spring Boot批處理作業(yè),它包含兩個(gè)主要步驟,第一個(gè)步驟從電子表格中讀取一串行。第二個(gè)寫入數(shù)據(jù)庫。現(xiàn)在,它已設(shè)置為串行寫入數(shù)據(jù)庫
public CompositeItemWriter<SoftLayerData> compositeSoftlayerDataWriter(
JpaItemWriter<SoftLayerData> softlayerDataWriter) {
CompositeItemWriter<SoftLayerData> compositeWriter = new CompositeItemWriter<>();
compositeWriter.setDelegates(asList(softlayerDataWriter));
return compositeWriter;
}
問題是體積太大。既然沒有理由維持任何秩序,我希望有多個(gè)作家。我嘗試過這個(gè):
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;
但是我收到一個(gè)IllegalArgumentException: No EntityManagerFactory specified
。
我喜歡這種方法,但我懷疑我必須遵循一些非常復(fù)雜的Spring Boot方法。處理多個(gè)寫入者的最佳方法是什么?
謝謝,
伐木工
推薦答案
CompositeItemWriter
調(diào)用委托編寫器是順序的,而不是并行的。因此,在復(fù)合編寫器中創(chuàng)建10個(gè)JpaItemWriter
作為委派不會(huì)使您的步驟成為多線程。
如果希望該步驟成為多線程,則需要向其添加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();
}
請(qǐng)參考Multi-Threaded step。
現(xiàn)在您的問題是使用new
運(yùn)算符創(chuàng)建JpaItemWriter
,因此Spring不會(huì)調(diào)用afterPropertiesSet
方法來檢查強(qiáng)制屬性。您需要在此編寫器上設(shè)置EntityManagerFactory
。
這篇關(guān)于ItemWriter的Spring Boot多線程的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,