我有一个用 JSR-352 实现的批处理(在 wildfly 上使用 jberet)。
我有一个项目计数为 15 的块,java.lang.Exception
并被配置为可重试和可跳过的异常。
当有很多异常时,大多数项目将被多次处理。在这种极端情况下,所有项目都会在 writer 中引发异常:
- 前 15 项已阅读
- 第一项发生异常
- 块被回滚并配置为 item-count = 1
- 第一项已读
- 再次出现异常,项目被跳过
- 继续其他14项,每一项都可能出现异常,每一项都被跳过
- 在前 15 个项目之后,块返回 item-count = 15
- 阅读第 16-30 项
- 再次出现异常
- 阅读器回滚到最新的检查点
此时仍然没有检查点,因为还没有成功处理过的项目。因此,读者再次从第一项开始。所有 30 个项目都以 item-count = 1 处理,等等。
如果有很多这样的失败,批处理将一次又一次地处理所有项目。
我认为还需要为跳过的项目设置检查点,因为不应再次处理跳过的项目。
我认为这是规范中的一个错误,所以我已经在那里打开了一个问题:https ://github.com/WASdev/standards.jsr352.batch-spec/issues/15 或者我错了并且误解了实现?
这是如何在 Spring Batch 中实现的?