我在批处理作业中有以下步骤。
<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 中捕获他并登录数据库。
我期待以下行为:
但实际上我得到了以下行为:
因此,一大块数据尝试处理并写入两次次。
答案 0 :(得分:8)
用几句话说:
这是因为当写入步骤SB中发生错误时,不知道哪个对象导致异常,因此执行回滚并且最后一个未提交的块的每个项目再次作为迷你块处理/写入以检测哪个对象是主写错误的原因。 您可以阅读更多(使用图表)here