在定义spring批处理作业并在xml描述中使用retry-limit参数时,它是运行的总数,还是重试的次数?即,当retry-limit = 1时,我的作业将运行一次还是两次(以防第一次运行时出错)?
这似乎是一个愚蠢的问题,但是我在所见过的任何文档中都没有找到明确的答案...
retry-limit
属性实际上是“基于项目”而不是“基于作业”。 “基于项目”是指对于读取/处理/写入的每个项目(记录/行),如果该项目失败,将重试重试限制。如果达到该限制,则step将失败。
例如
<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>
[在上述基本步骤配置中,当步骤中的任何组件(SomeException
,itemReader
或itemWriter
)抛出itemProcessor
时,该项目在该步骤之前最多重试三遍失败。
这里是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>
该步骤限制了单个项目的重试次数,并列出了“可重试”的例外。有关重试工作方式的更多详细信息,请参见Chapter 9, Retry。
春季批处理作业会失败,如果任何步骤未能完成执行而没有任何错误或异常。如果在任何步骤中发生任何错误或异常,则将该步骤定义为失败,与此同时,该作业也被定义为失败的作业。
重试限制属性实际上是“基于项目”而不是“基于作业”。 “基于项目”是指对于读取/处理/写入的每个项目(记录/行),如果该项目失败,将重试重试限制。如果达到该限制,则该步骤将失败。