具有可重试和可跳过异常的jsr 352批处理可能会多次处理项目

时间:2018-11-16 14:22:33

标签: java java-ee jsr352 jberet jbatch

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

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

当有很多例外时,大多数项目将被多次处理。在这种极端情况下,所有项目都会在编写器中引发异常:

  • 阅读前15个项目
  • 第一项发生异常
  • Chunk已回滚并配置为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中如何实现?

1 个答案:

答案 0 :(得分:2)

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

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

  

8.2.1.4.3重试并跳过相同的异常

表示在进行带回滚的重试期间,每次处理一次(以单个项目块的形式),并且在重试期间跳过优先。

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

因此,我建议生成一个重新创建的项目并打开一个JBeret问题(如果看起来仍然如此)。目前,我还没有看到规格问题。