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






