Spring Batch跳过异常未按预期工作

时间:2019-06-26 19:26:55

标签: java spring spring-batch

我有一个春季批处理工作,其中包括一个步骤,这是下面的步骤。它读取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。

1 个答案:

答案 0 :(得分:0)

我能够使用this answer使它工作。解决该问题所需要做的就是保存后刷新entityManager。我的写方法现在看起来像这样:

@Override
public void write(List<? extends DetailApplication> list) {
    detailApplicationRepository.saveAll(list);
    entityManager.flush();
}