Java 重试失败的作业spring批处理

Java 重试失败的作业spring批处理,java,spring-batch,Java,Spring Batch,我想在xml中定义一个重试限制,如果某个特定项上的任何读/处理/写操作失败,它将重试定义的次数。我得到了这个概念,但我没有让它在代码中工作 我在项目中也有所有适当的maven支持依赖项 以下是该步骤的xml定义: <batch:step id="step1" > <batch:tasklet> <batch:chunk reader="myReader" processor="myProcessor" writer="myWr

我想在xml中定义一个重试限制,如果某个特定项上的任何读/处理/写操作失败,它将重试定义的次数。我得到了这个概念,但我没有让它在代码中工作

我在项目中也有所有适当的maven支持依赖项

以下是该步骤的xml定义:

<batch:step id="step1" >
        <batch:tasklet>
            <batch:chunk reader="myReader" processor="myProcessor" writer="myWriter" commit-interval="10" **retry-limit="3"**>
                <batch:retryable-exception-classes>
                    <batch:include class="java.lang.ArithmeticException"/>
                </batch:retryable-exception-classes>
            </batch:chunk>
        </batch:tasklet>
</batch:step>


我正在使用JdbcCursorItemReader从数据库中读取数据。在mapper中,我试图手动引入一个错误(java.lang.arithmetricexception:/by zero),只是为了检查它是如何工作的。我的理解是,当出现“/by zero”错误时,它应该重试3次,最终失败,但我看不到它会退出。这里有什么我遗漏的吗?

重试只在块步骤的处理和写入阶段操作,而不是读取阶段。有关它的一些讨论,请参见:

经过深思熟虑,我认为我们不应该支持ItemReader的重试 -语义太难定义了。您在这里的实际用例是什么?您的ItemReader做了哪些可检索的工作?中的问题 一般来说,ItemReader是一个“仅转发”的合同,而不是 通常可以实现可以返回到 在流中的前一个位置,以及我们拥有的接口(我们是 如果没有充分的理由,就不会让事情变得更复杂)。鉴于 如果read()失败,当我们 “重试”该操作?转到下一项是唯一可能的 选择,这在功能上与跳过相同


所以,据我所知,spring不会自行重试,除非您告诉它这样做。重试限制和所有其他参数只是限制,而不是实际的重试本身。

考虑放弃XML,只使用:


更灵活、更不脆弱、真实的代码,而且可以正常工作。

您能在配置Retry抱歉的地方显示代码吗。这是我关于堆栈溢出的第一个问题。更正了问题以显示代码。您希望看到什么(记录消息?您是否逐步查看了代码?)以及您看到了什么?我希望看到一些日志,上面写着“尝试重试”之类的内容。我启用了调试日志,但没有看到任何类似的内容。如果重试,将再次出现错误。我想在日志中看到这些错误,明白了。我在处理器上做了同样的测试。它失败,但不重试。它应该在处理器中重试。在这种情况下,您可以提供完整的代码和配置吗?对我来说,在出现故障的处理器中重试可以正常工作。
RetryPolicy retryPolicy = new RetryPolicy()
  .retryOn(ArithmeticException.class)
  .withMaxRetries(3);

Failsafe.with(retryPolicy).run(() -> processBatch());