![](/img/trans.png)
[英]Spring Batch Rollback full Step instead of current transaction in chunk orientation
[英]Spring batch Step does not read full file
嗨,我對 Spring 批處理有問題,我通過兩步創建一個作業,第一步讀取 csv 文件,通過塊過濾錯誤值並保存到數據庫中,然后第二次調用存儲過程。
我的問題是,由於某種原因,第一步僅讀取部分數據文件 2,5GB csv。
該文件有大約 13M 的記錄,但只保存了大約 400K。
任何人都知道為什么會發生這種情況以及如何解決它?
Java版本: 8
Spring開機版2.7.1
這是我的一步
@Autowired
@Bean(name = "load_data_in_db_step")
public Step importData(
MyProcessor processor,
MyReader reader,
TaskExecutor executor,
@Qualifier("step-transaction-manager") PlatformTransactionManager transactionManager
) {
return stepFactory.get("experian_portals_imports")
.<ExperianPortal, ExperianPortal>chunk(chunkSize)
.reader(reader)
.processor(processor)
.writer(new JpaItemWriterBuilder<ExperianPortal>()
.entityManagerFactory(factory)
.usePersist(true)
.build()
)
.transactionManager(transactionManager)
.allowStartIfComplete(true)
.taskExecutor(executor)
.build();
}
這是 MyReader 的定義
@Slf4j
@Component
public class MyReader extends FlatFileItemReader<ExperianPortal>{
private final MyLineMapper mapper;
private final Resource fileToRead;
@Autowired
public ExperianPortalReader(
MyLineMapper mapper,
@Value("${ext.datafile}") String pathToDataFile
) {
this.mapper = mapper;
val formatter = DateTimeFormatter.ofPattern("yyyyMM");
fileToRead = new FileSystemResource(String.format(pathToDataFile, formatter.format(LocalDate.now())));
}
@Override
public void afterPropertiesSet() throws Exception {
setLineMapper(mapper);
setEncoding(StandardCharsets.ISO_8859_1.name());
setLinesToSkip(1);
setResource(fileToRead);
super.afterPropertiesSet();
}
}
編輯:我已經嘗試使用單線程策略,我認為這可能是 RepeatTemplate 的問題,但我不知道如何正確使用它。
編輯 2 :我放棄了自定義解決方案,並使用了默認組件,它們工作正常,問題得到解決。
記住只使用 spring 批量組件
這是因為您在多線程步驟中使用了非線程安全的項目閱讀器。 您的項目閱讀器擴展了FlatFileItemReader
,而FlatFileItemReader
不是線程安全的: 將 FlatFileItemReader 與 TaskExecutor (Thread Safety) 一起使用。 您可以嘗試使用單個線程步驟(刪除.taskExecutor(executor)
),您會看到將讀取整個文件。
發生的情況是線程正在同時讀取記錄並且讀取計數不被遵守(線程正在增加讀取計數並且步驟“認為”文件已被完全讀取)。 你有幾個選擇:
read
的調用SynchronizedItemStreamReader
中(結果與前一點相同)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.