我有一个用JSR-352(在wildfly上使用jberet)实现的批处理。
我有一个项目计数为15的块,并且java.lang.Exception
被配置为可重试和可跳过的异常。
当有很多例外时,大多数项目将被多次处理。在这种极端情况下,所有项目都会在编写器中引发异常:
此时,由于没有成功的已处理项目,因此仍然没有检查点。因此,读者再次从第一项开始。全部30个项目的item-count = 1等。
如果出现很多此类失败,批次将一次又一次地处理所有项目。
我认为也需要为跳过的项目设置检查点,因为跳过的项目不应再次处理。
我认为这是规范中的错误,因此我已经在此处提出了一个问题:https://github.com/WASdev/standards.jsr352.batch-spec/issues/15 还是我错了并且误解了实现?
这在Spring Batch中如何实现?
答案 0 :(得分:2)
我认为规范很清楚,这表明这可能是JBeret的错误(假设这不是应用程序问题)。
在规范(非官方版本here)中,该部分:
8.2.1.4.3重试并跳过相同的异常
表示在进行带回滚的重试期间,每次处理一次(以单个项目块的形式),并且在重试期间跳过优先。
因此,如果重试期间发生可跳过的异常,则该项目将被跳过,并且应保留更新的检查点。这就是我正在研究的JSR 352实现WebSphere Liberty Batch的工作方式。
因此,我建议生成一个重新创建的项目并打开一个JBeret问题(如果看起来仍然如此)。目前,我还没有看到规格问题。