重试失败的作业弹簧批次

时间:2016-02-24 17:47:49

标签: java spring-batch

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

3 个答案:

答案 0 :(得分:0)

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

  

反思我不认为我们应该支持重试ItemReader    - 语义太难定义。你在这里的实际用例是什么?你的ItemReader做什么是可以重试的?问题在于   一般来说,ItemReader只是一个&#34;仅向前&#34;合同 - 它不是   通常可以实现可以返回的读者   我们拥有的界面在流中的先前位置(我们是   没有充分的理由不会让它变得更复杂)。特定   如果read()失败,那么当我们读者应该做什么时   &#34;重试&#34;操作?转到下一个项目是唯一可能的   选择,这在功能上与跳过相同。

答案 1 :(得分:0)

考虑放弃XML并使用Failsafe

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

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

更灵活,更不易碎,真实的代码,并且它可以工作。

答案 2 :(得分:-1)

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