【问题标题】:Spring Batch skipping exceptions not working as expectedSpring Batch 跳过异常未按预期工作
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2020-04-04
    • 1970-01-01
    • 2014-04-26
    • 1970-01-01
    • 2021-08-12
    • 1970-01-01
    • 2022-01-23
    • 2011-03-11
    • 1970-01-01
    相关资源
    最近更新 更多