Spring Batch重试策略和跳过策略问题

时间:2014-03-10 10:58:49

标签: spring spring-batch

我在批处理作业中有以下步骤。

    <batch:step id="parse-step">
        <batch:tasklet>
            <batch:chunk reader="xmlCommonReader"
                         processor="xmlCommonProcessor"
                         writer="xmlCommonWriter"
                         commit-interval="1">
                <batch:skip-policy>
                    <bean class="org.springframework.batch.core.step.skip.AlwaysSkipItemSkipPolicy" scope="step"/>
                </batch:skip-policy>
                <batch:retry-policy>
                    <bean class="org.springframework.retry.policy.NeverRetryPolicy" scope="step"/>
                </batch:retry-policy>
            </batch:chunk>
        </batch:tasklet>
        <batch:next on="FAILED" to="file-failed-step"/>
        <batch:next on="COMPLETED" to="file-success-step"/>
        <batch:listeners>
            <batch:listener ref="parseStepExecutionListener"/>
            <batch:listener ref="parseStepSkipListener"/>
        </batch:listeners>
    </batch:step>

当某个异常抛出时,我会在 parseStepSkipListener 中捕获他并登录数据库。

我期待以下行为:

  1. 工作开始
  2. 执行上一步骤
  3. 开始执行解析步骤
  4. 阅读项目
  5. 处理项目
  6. 写入
    1. Ooooops,例外。
    2. 捕获异常,登录数据库,转到下一个块(读取,处理,写入)。
  7. 继续执行其他步骤。
  8. 完成工作。
  9. 但实际上我得到了以下行为:

    1. 工作开始
    2. 执行上一步骤
    3. 开始执行解析步骤
    4. 阅读项目
    5. 处理项目
    6. 写入
      1. Ooooops,例外。
      2. 处理项目
      3. 写项目
        1. Ooooops,例外。
        2. 捕获异常,登录数据库,转到下一个块(读取,处理,写入)。
    7. 继续执行其他步骤。
    8. 完成工作。
    9. 因此,一大块数据尝试处理并写入两次次。

1 个答案:

答案 0 :(得分:8)

用几句话说:

这是因为当写入步骤SB中发生错误时,不知道哪个对象导致异常,因此执行回滚并且最后一个未提交的块的每个项目再次作为迷你块处理/写入以检测哪个对象是主写错误的原因。 您可以阅读更多(使用图表)here