5

我有一个用 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 中实现的?

4

1 回答 1

2

我认为规范很清楚,这表明这可能是 JBeret 错误(假设它不是应用程序问题)。

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

8.2.1.4.3 重试并跳过相同的异常

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

因此,如果在重试期间发生可跳过的异常,则该项目将被跳过,并且应保留更新的检查点。这就是我从事的 JSR 352 实现WebSphere Liberty Batch的工作方式。

所以我建议制作一个重新创建的项目并打开一个 JBeret 问题,如果它看起来仍然像一个。在这一点上,我没有看到规范问题。

于 2018-11-16T19:59:03.927 回答