Spring batch Spring批处理:跳过异常未按预期运行
我已在下面配置了我的Spring批处理应用程序:Spring batch Spring批处理:跳过异常未按预期运行,spring-batch,Spring Batch,我已在下面配置了我的Spring批处理应用程序: <batch:job id="mPortRiskJob"> <batch:step id="mPortRiskStep"> <tasklet throttle-limit="10"> <chunk reader="MPortRiskReader" processor="MPortRiskProcessor" writer="MPortRiskWriter"
<batch:job id="mPortRiskJob">
<batch:step id="mPortRiskStep">
<tasklet throttle-limit="10">
<chunk reader="MPortRiskReader" processor="MPortRiskProcessor" writer="MPortRiskWriter" commit-interval="10"
skip-limit="1">
<batch:skippable-exception-classes>
<include class="com.common.exception.ERDException"/>
</batch:skippable-exception-classes>
</chunk>
<batch:no-rollback-exception-classes>
<include class="com.common.exception.ERDException"/>
</batch:no-rollback-exception-classes>
</tasklet>
</batch:step>
<batch:listeners>
<batch:listener ref="MJobExecutionListener"/>
</batch:listeners>
</batch:job>
我想要的是,例如,如果第一条记录抛出一个
DuplicateKeyException
,则跳过该记录,插入下一条记录。发生的情况是,当抛出erdeception
时,Spring批处理会重试所有记录,包括重复记录。我希望它丢弃该特定记录并插入其他记录。有没有办法做到这一点?既然您的异常是在writer中抛出的,提交间隔为10,那么它将再次重试所有10条记录,因为它需要确定哪个记录抛出异常。一旦确定记录,它将跳过该记录并处理其他记录
请参阅帖子。对于任何感兴趣的人,我通过将
无回滚异常类
与跳过策略
相结合,解决了我的问题!我可能在定义自己的跳过策略时有点过火了——一个开箱即用的Spring策略就可以了。见下文:
<bean id="skipPolicy" class="com.trp.erd.batch.ERDSkipPolicy">
<batch:job id="midrPortRiskJob">
<batch:step id="midrPortRiskStep">
<tasklet throttle-limit="10">
<chunk reader="MIDRPortRiskReader" processor="MIDRPortRiskProcessor" writer="MIDRPortRiskWriter" commit-interval="10"
skip-limit="1" skip-policy="skipPolicy">
<batch:skippable-exception-classes>
<include class="com.trp.erd.common.exception.ERDException"/>
</batch:skippable-exception-classes>
</chunk>
<batch:no-rollback-exception-classes>
<include class="com.trp.erd.common.exception.ERDException"/>
</batch:no-rollback-exception-classes>
</tasklet>
</batch:step>
<batch:listeners>
<batch:listener ref="MIDRJobExecutionListener"/>
</batch:listeners>
</batch:job>
那么,这是否意味着我的跳过限制也应该是10?我希望它只尝试一次,这就是为什么我将限制设置为1.No。对于作家来说,它将尝试两次。你无能为力。但是它不应该尝试超过两次。写我自己的SkipListener能帮助我实现我想要的吗?
<bean id="skipPolicy" class="com.trp.erd.batch.ERDSkipPolicy">
<batch:job id="midrPortRiskJob">
<batch:step id="midrPortRiskStep">
<tasklet throttle-limit="10">
<chunk reader="MIDRPortRiskReader" processor="MIDRPortRiskProcessor" writer="MIDRPortRiskWriter" commit-interval="10"
skip-limit="1" skip-policy="skipPolicy">
<batch:skippable-exception-classes>
<include class="com.trp.erd.common.exception.ERDException"/>
</batch:skippable-exception-classes>
</chunk>
<batch:no-rollback-exception-classes>
<include class="com.trp.erd.common.exception.ERDException"/>
</batch:no-rollback-exception-classes>
</tasklet>
</batch:step>
<batch:listeners>
<batch:listener ref="MIDRJobExecutionListener"/>
</batch:listeners>
</batch:job>
public class ERDSkipPolicy implements SkipPolicy {
@Override
public boolean shouldSkip(Throwable t, int skipCount) {
if (t instanceOf ERDException) {
return true;
}
}
}