春季批处理:跳过异常行为异常

时间:2019-12-10 18:56:35

标签: spring-batch

我已经在下面配置了Spring Batch应用程序:

<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">
               <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>

在我的作家中,我有一个for循环,可将记录插入数据库中。代码如下:

for (String id : keylist) {
  try {
      insertRecord(id);
  } catch (Exception e) {
      throw new ERDException("Failure in write method", e);
  }
}

我想要的是,例如,第一条记录抛出DuplicateKeyException,从而跳过该记录,并插入下一条记录。发生的情况是,抛出ERDException时,Spring Batch重试所有记录,包括重复记录。我希望它丢弃该特定记录并插入其他记录。有没有办法做到这一点?

2 个答案:

答案 0 :(得分:0)

好吧,因为您的异常是在commit-interval为10的writer中引发的,所以它再次重试所有10条记录,因为它需要确定哪个记录引发了异常。一旦确定了记录,它将跳过该记录并处理其他记录。

请参阅this帖子。

答案 1 :(得分:0)

对于有兴趣的人,我将<div class="form-group" id="email-sender-div"> <div><label for="email-recipients">Email Sender</label></div> <input type="text" class="form-control autocomplete" value="" id="email-sender"> </div> <div class="form-group" id="email-recipients-div"> <div><label for="email-recipients">Email Recipients</label></div> <input type="text" class="form-control autocomplete" value=""> </div> no-rollback-exception-classes结合起来解决了我的问题!我可能在定义自己的跳过策略时花了一些力气-一种现成的Spring策略就可以了。见下文:

skip-policy

以及跳过策略的实现:

<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>