我有一个春季批处理工作,其中包括一个步骤,这是下面的步骤。它读取100个json文件以进行处理,并将它们以25个块的形式保存到数据库中。由于块中不同的insert语句会导致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。
答案 0 :(得分:0)
我能够使用this answer使它工作。解决该问题所需要做的就是保存后刷新entityManager。我的写方法现在看起来像这样:
@Override
public void write(List<? extends DetailApplication> list) {
detailApplicationRepository.saveAll(list);
entityManager.flush();
}