首页 > 解决方案 > Spring Batch 跳过异常未按预期工作

问题描述

我有一个由一个步骤组成的春季批处理作业,即下面的步骤。它读取 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。

标签: javaspringspring-batch

解决方案


我能够使用这个答案使其工作。为了解决这个问题,我所要做的就是在保存后刷新 entityManager。我的 write 方法现在看起来像这样:

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

推荐阅读