具有可重试和可跳过异常的jsr352批处理可以多次处理项目



我有一个用JSR-352实现的批处理(在wildfly上使用jberet(。

我有一个项目计数为15的区块,java.lang.Exception被配置为可重试和可跳过的异常。

当有许多异常时,大多数项目将被多次处理。在这种极端情况下,所有项目都会在编写器中抛出一个异常:

  • 读取前15项
  • 第一个项目出现异常
  • 区块被回滚并配置为项目计数=1
  • 读取第一项
  • 再次发生异常,跳过项目
  • 继续其他14个项目,每个项目都可能出现异常,跳过每个项目
  • 在前15个项目之后,块返回,项目计数=15
  • 读取项目16-30
  • 再次发生异常
  • 读取器回滚到最新的检查点

此时仍然没有检查点,因为还没有成功处理的项目。因此,读者再次从第一项开始。处理所有30个项目,项目计数为1。等

如果有许多这样的故障,该批处理将一次又一次地处理所有项目。

我认为还需要为跳过的项目设置检查点,因为跳过的项目不应该再次处理。

我认为这是规范中的一个错误,所以我已经在那里打开了一个问题:https://github.com/WASdev/standards.jsr352.batch-spec/issues/15还是我错了,误解了执行?

这是如何在Spring Batch中实现的?

我认为规范已经足够清楚了,这表明这可能是JBeret错误(假设这不是应用程序问题(。

在规范(此处为非官方版本(中,部分:

8.2.1.4.3重试并跳过相同的异常

表示,在带回滚的重试过程中,项目一次处理一个(在一个项目块中(,并且在重试过程中跳过优先。

因此,如果在重试过程中发生了可跳过的异常,那么该项将被跳过,并且更新的检查点应该被持久化。这就是我所研究的JSR352实现WebSphereLibertyBatch的工作方式

因此,我建议制作一个重建项目,如果它看起来仍然像JBeret,那么就打开它。在这一点上,我没有看到规范问题。

最新更新