Spring批量重试限制

时间:2014-06-17 14:35:41

标签: spring spring-batch

定义spring批处理作业并在xml描述中使用retry-limit参数时,它是运行总数还是重试次数? 即,当retry-limit = 1时,我的作业会运行一次还是两次(如果第一次运行时出错)?

这似乎是一个愚蠢的问题,但我没有在我见过的任何文档中找到明确的答案......

3 个答案:

答案 0 :(得分:3)

retry-limit属性实际上是“基于项目”而不是“基于作业”。通过“基于项目”我的意思是对于每个读取/处理/写入的项目(记录/行),如果该项目失败,将重试重试限制。如果达到该限制,步骤将失败。

例如

<step id="someStep">
    <tasklet>
        <chunk reader="itemReader" writer="itemWriter"
               processor="itemProcessor" commit-interval="20"
               retry-limit="3">
            <retryable-exception-classes>
                <include class="org.springframework.exception.SomeException"/>
            </retryable-exception-classes>
        </chunk>
    </tasklet>
</step>

在上述基本步骤配置中,当步骤(SomeExceptionitemReaderitemWriter)中的任何组件引发itemProcessor时,该项目在步骤失败之前重试最多三次。


这是Spring doc的解释

  

在大多数情况下,您希望异常导致跳过或步骤失败。但是,并非所有例外都是确定性的。如果在阅读时遇到FlatFileParseException,则会始终为该记录抛出该值;重置ItemReader无济于事。但是,对于其他异常,例如DeadlockLoserDataAccessException,表示当前进程已尝试更新另一个进程持有锁的记录,等待并再次尝试可能会导致成功。在这种情况下,应配置重试:

<step id="step1">
   <tasklet>
      <chunk reader="itemReader" writer="itemWriter"
             commit-interval="2" retry-limit="3">
         <retryable-exception-classes>
            <include class="org.springframework.dao.DeadlockLoserDataAccessException"/>
         </retryable-exception-classes>
      </chunk>
   </tasklet>
</step>
  

“步骤”允许限制单个项目的重试次数,以及“可重试”的例外列表。有关重试如何工作的更多详细信息,请参阅Chapter 9, Retry

答案 1 :(得分:0)

如果任何步骤未能完成执行而没有任何错误或异常,则

spring批处理作业失败。 如果在任何步骤中发生任何错误或异常,则该步骤被定义为失败,因此该作业也被定义为失败的作业。

首先,如果要重新启动作业,则需要确保将作业定义为可重新启动。除此以外 你再也不能跑同样的工作了。更多的工作只能重新启动,并且只有在之前失败时才能重启 尝试。成功完成后,即使将其声明为可重启,也无法重新启动作业,是的,但是作业参数必须不同。

retry-limit属性定义失败作业的失败任务/步骤可以重试启动的次数

要使用重试限制,您还需要定义应重试的异常或错误

答案 2 :(得分:0)

retry-limit属性实际上是“基于项目”而不是“基于作业”。 “基于项目”是指对于读取/处理/写入的每个项目(记录/行),如果该项目失败,将重试重试限制。如果达到该限制,则该步骤将失败。

例如,如果将retry-limit设置为2,它将尝试执行两次。