【问题标题】:retry failed job spring batch重试失败的工作春季批处理
【发布时间】:2016-06-07 04:05:12
【问题描述】:

我想在 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 从数据库中读取数据。在映射器中,我试图手动引发错误(java.lang.ArithmeticException: / by zero)只是为了检查它是如何工作的。我的理解是,当它遇到“/ by zero”错误时,它应该重试 3 次并最终失败,但我认为它不会退休。我这里有什么遗漏吗?

【问题讨论】:

  • 你能在你配置重试的地方显示代码
  • 对不起。这是我关于堆栈溢出的第一个问题。更正了问题以显示代码。
  • 您希望准确看到什么(记录消息?您是否单步执行了代码?)您看到了什么?
  • 我想看看一些日志说“尝试重试”之类的。我启用了调试日志记录,但我没有看到任何类似的东西。如果它重试,将再次出现错误。我想在日志中查看这些错误。

标签: java spring-batch


【解决方案1】:

考虑放弃 XML,只使用 Failsafe

RetryPolicy retryPolicy = new RetryPolicy()
  .retryOn(ArithmeticException.class)
  .withMaxRetries(3);

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

更多的灵活性,更少的脆弱性,真实的代码,并且可以工作。

【讨论】:

    【解决方案2】:

    据我所知,除非您告诉它,否则 spring 不会自行重试。 retry-limit 和所有其他参数只是限制,而不是实际的重试本身。

    【讨论】:

      【解决方案3】:

      重试仅对块步骤的处理和写入阶段进行操作,而不是读取。有关它的一些讨论,请参阅this

      经过反思,我认为我们不应该支持 ItemReader 的重试 - 语义太难定义。您在这里的实际用例是什么?你的 ItemReader 做什么是可重试的?问题在 一般是 ItemReader 是“仅转发”合同 - 它不是 通常可以实现可以返回到 流中的先前位置与我们拥有的接口(我们是 没有充分的理由不会让它变得更复杂)。给定 也就是说,如果 read() 失败了,当我们读取时,读者应该怎么做? “重试”操作?转到下一项是唯一可能的 选择,在功能上与跳过相同。

      【讨论】:

      • 明白了。我在处理器中做了同样的测试。它失败了,但不会重试。它应该在处理器中重试。
      • 在这种情况下,你能提供完整的代码和配置吗?对我来说,在出现故障的处理器中重试可以按预期工作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-08
      • 2012-10-19
      • 1970-01-01
      • 1970-01-01
      • 2018-04-03
      • 2014-12-15
      • 2018-05-27
      相关资源
      最近更新 更多