【发布时间】:2014-06-17 14:35:41
【问题描述】:
当定义一个spring批处理作业并在xml描述中使用retry-limit参数时,它是运行的总次数,还是重试次数? 即当 retry-limit=1 时,我的作业会运行一次还是两次(以防第一次运行出错)?
这似乎是一个愚蠢的问题,但我在我看过的任何文档中都没有找到明确的答案......
【问题讨论】:
标签: spring spring-batch
当定义一个spring批处理作业并在xml描述中使用retry-limit参数时,它是运行的总次数,还是重试次数? 即当 retry-limit=1 时,我的作业会运行一次还是两次(以防第一次运行出错)?
这似乎是一个愚蠢的问题,但我在我看过的任何文档中都没有找到明确的答案......
【问题讨论】:
标签: spring spring-batch
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>
在上述基本步骤配置中,当步骤中的任何组件(itemReader、itemWriter 或 itemProcessor)抛出 SomeException 时,该项目最多重试 3 次,然后步骤失败。
这是 Spring 文档的解释
在大多数情况下,您希望异常导致跳过或步骤失败。但是,并非所有异常都是确定性的。如果在读取时遇到
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>
Step 允许对单个项目的重试次数进行限制,并提供“可重试”的异常列表。有关重试工作原理的更多详细信息,请参阅Chapter 9, Retry。
【讨论】:
如果任何步骤未能完成执行而没有任何错误或异常,则弹簧批处理作业将失败。 如果在任何步骤中发生任何错误或异常,则该步骤被定义为失败,这样该作业也被定义为失败的作业。
首先,如果要重新启动作业,您需要确保该作业被定义为可重新启动。否则 您不能再次运行相同的作业。更多的工作只能重新启动,并且只有在之前失败的情况下 试图。成功完成后,即使将作业声明为可重新启动,您也无法重新启动作业,是的,您可以,但作业参数必须不同。
retry-limit 属性定义了失败作业的失败任务/步骤可以重试启动多少次
要使用重试限制,您还需要定义应该重试哪个异常或错误
【讨论】:
retry-limit 属性实际上是“基于项目”而不是“基于作业”。 “基于项目”是指对于每个被读取/处理/写入的项目(记录/行),如果该项目失败,它将在重试限制内重试。如果达到该限制,则该步骤将失败。
例如如果retry-limit设置为2,它会尝试执行两次。
【讨论】: