Spring Batch - 跳过进程记录

时间:2015-03-13 11:32:55

标签: spring-batch

我想跳过一些关于流程的记录。

我试过的是,我创建了自定义异常,当我想跳过记录并调用Skip监听器onSkipInProcess方法时抛出异常。它工作正常。

请找到配置。

 <batch:chunk reader="masterFileItemReader" writer="masterFileWriter" processor="itemProcessor" commit-interval="5000" skip-limit="100000" >
  <batch:skippable-exception-classes>
        <batch:include class="org.springframework.batch.item.file.FlatFileParseException"/>
        <batch:include class="com.exception.SkipException"/>
  </batch:skippable-exception-classes>
  <batch:listeners>
        <batch:listener ref="recordSkipListener"/>
</batch:listeners>

但我想知道有没有其他方法可以跳过进程中的记录?

此致 香卡

4 个答案:

答案 0 :(得分:8)

确实有两种方法可以做到这一点,一种是你提到跳过机制,另一种是返回null,它会过滤掉项目而不是写出来。这里是documentation link - 6.3.2. Filtering records,很好地解释了两种方法之间的区别。此blog post解释了批量跳过细节和交易。

当您解析csv文件并且您希望每行有5个项目但是一行包含6个无效项目时,您可以选择跳过它(通过将读者异常标记为可跳过并在策略中定义条件,如您给出的那样例)。但是,如果每一行都包含名称,并且您的用例是不编写以字母N开头的项目,这些项目更好地通过返回null(过滤项目)实现,因为它是有效项目但不是根据您的业务情况下。

另请注意,如果您返回null这些项目的数量将位于StepContext中的getFilterCount(),如果您使用跳过方式,则会getReadSkipCount()getProcessorSkipCount尊重{1}}和getWriteSkipCount

答案 1 :(得分:1)

@Component
@Scope(value = "step")
public class XyzItemProcessor implements ItemProcessor<ABCInfo , ABCInfo > {

@Override
public ABCInfo process(ABCInfo abcInfo) throws Exception {

    if (abcInfo.getRecordType().equals("H") || extVoterInfo.getRecordType().equals("T"))
        return null;////this is how we skip particular record to persist in database
    else {
        return abcInfo;
    }
}
}

返回null将跳过要保留在数据库中的特定记录

答案 2 :(得分:0)

当我们在process()方法中返回null时,它将过滤记录并增加过滤器计数。

@Transactional(propagation = Propagation.REQUIRED)
    @Override
    public SomeObject process(SomeObject someObject) throws Exception {
        if (some condition) {
            return null;
        }   
}

如果我们想跳过记录,则抛出异常。这将跳过记录并增加processSkipCount。

@Transactional(propagation = Propagation.REQUIRED)
    @Override
    public SomeObject process(SomeObject someObject) throws Exception {
        if (some condition) {
            throw new Exception("invalid record");
        }   
}

将此异常添加到上下文文件中。

<batch:skippable-exception-classes>
<batch:include class="java.lang.Exception" />
</batch:skippable-exception-classes>

答案 3 :(得分:0)

还有另一种不写(跳过)东西的方法。例如,我们说我们有这个步骤:

        <batch:step id="createCsvStep">
         <batch:tasklet>
            <batch:chunk reader="jdbcCursorItemReader" processor="processor" writer="compositeWriter"
                         commit-interval="#{jobParameters['commit.interval']}" />
         </batch:tasklet>
        </batch:step>

        <bean id="compositeWriter" class="org.springframework.batch.item.support.CompositeItemWriter" scope="step">
         <property name="delegates">
          <list>
            <ref bean="csvFileItemWriter1"/>
            <ref bean="csvFileItemWriter2"/>
          </list>
        </property>
       </bean>

让我们假设第一个作家将写下所有的值,但同时,第二个作者将跳过其中的一些。为了实现这一点,我们可以扩展我们的编写器(例如FlatFileItemWriter),并覆盖它的写方法,如下所示:

    @Override
public void write(List<? extends T> items) throws Exception {
    // ...
    if (itemsPassesCheckingCondition) {
        super.write(items);
    }
}