我想在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次并最终失败但我不认为它退休。这里有什么我想念的吗?
答案 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不会自行重试。重试限制和所有其他参数只是限制而不是实际的重试本身。