【问题标题】:Spring batch retry-limitSpring批处理重试限制
【发布时间】:2014-06-17 14:35:41
【问题描述】:

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

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

【问题讨论】:

    标签: spring spring-batch


    【解决方案1】:

    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。

    【讨论】:

    • 这一切都很好,我或多或少地熟悉它;-) 我要求一些非常具体的东西......我认为我的问题的答案隐藏在你的文本的第二行, 正确的? :-)
    • 问题到底是什么?我以为我的回答涵盖了您提出的问题。- 1) “是运行总数还是重试次数?” -> 是重试次数。 2) " 作业运行一次或两次(以防第一次运行出错)" -> 您的作业将运行一次,但与重试限制无关。重试限制用于项目处理,而不是作业运行。 Jobs 和 Items 是两个不同的概念
    • 如果您正在寻找不同的答案,您是否可能没有提出正确的问题?
    • 好的,那么在这种情况下“item”会运行两次,对吧?
    • 是的,它将运行两次。一次用于主运行,第二次用于重试。
    【解决方案2】:

    如果任何步骤未能完成执行而没有任何错误或异常,则弹簧批处理作业将失败。 如果在任何步骤中发生任何错误或异常,则该步骤被定义为失败,这样该作业也被定义为失败的作业。

    首先,如果要重新启动作业,您需要确保该作业被定义为可重新启动。否则 您不能再次运行相同的作业。更多的工作只能重新启动,并且只有在之前失败的情况下 试图。成功完成后,即使将作业声明为可重新启动,您也无法重新启动作业,是的,您可以,但作业参数必须不同。

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-03
        • 1970-01-01
        • 2017-12-11
        相关资源
        最近更新 更多