【发布时间】:2019-06-26 19:26:55
【问题描述】:
我有一个包含一个步骤的春季批处理作业,即下面的步骤。它读取 100 个 json 文件进行处理,并将它们以 25 个块的形式保存到数据库中。由于块中的不同插入语句可能会导致 ConstraintViolationException,因此可以通过逐个处理来轻松解决。这就是为什么我考虑使用'faultTolerant'和skipLimit(也尝试过重试),希望当25个项目的块失败时,它会一个一个地重试它们以找到有故障的一个并提交其他24个DetailApplications。然而,这种情况并非如此。它只是跳过了 25 个 DetailApplications 的整个块。最终统计数据是 3 次提交、100 次读取、75 次写入和 1 次回滚。我在这里做错了什么?或者我忘记了什么?
步骤:
return stepBuilderFactory.get("stepImportDetailsJob")
.<DataJson, DetailApplication> chunk(25)
.reader(detailApplicationReader)
.processor(detailApplicationProcessor)
.writer(detailApplicationWriter)
.faultTolerant()
.skipLimit(5)
.skip(Exception.class)
.build();
写法:
@Override
public void write(List<? extends DetailApplication> list) {
detailApplicationRepository.saveAll(list);
}
该列表的大小始终为 25(块大小),而我希望在“定位”问题时为 1。
【问题讨论】:
-
我看不出你的配置有什么问题。块扫描应该适用于您的情况。您可以尝试将可跳过的异常类型缩小到
ConstraintViolationException吗?否则,请分享一个最小项目(带有内存数据库)来重现该问题,我会尽力提供帮助。
标签: java spring spring-batch