Spring batch Spring批处理在遇到可跳过的异常之前忽略已处理的行

Spring batch Spring批处理在遇到可跳过的异常之前忽略已处理的行,spring-batch,Spring Batch,您好,我是Spring batch的新手,使用版本3.0.4.RELEASE让我的POC处理一个非常大的平面文件,如下所示 在块处理模式下运行批处理 具有同步方法的自定义读取器委托以运行 验证和转换数据的自定义处理器 文件格式如下所示 COB\u日期层次结构\u节点\u ID层次结构\u级别度量货币值 20151009 329715成本中心对V_头寸60d 21848543.55美元 20151009 329715成本中心到V_位置90d 9040531.7美元 201510009 329715

您好,我是Spring batch的新手,使用版本3.0.4.RELEASE让我的POC处理一个非常大的平面文件,如下所示

  • 在块处理模式下运行批处理

  • 具有同步方法的自定义读取器委托以运行

  • 验证和转换数据的自定义处理器

  • 文件格式如下所示

    COB\u日期层次结构\u节点\u ID层次结构\u级别度量货币值
    20151009 329715成本中心对V_头寸60d 21848543.55美元
    20151009 329715成本中心到V_位置90d 9040531.7美元
    201510009 329715成本中心与V_30d比率47.0069727152
    20151009 329715成本中心对价值比率20.2442137613
    20151009 329715成本中心对价值比率121.7425393354
    20151009 329715成本中心对V_的营业额为259996659.00美元

    我对COB_日期字段进行了验证,如果格式不正确,我将在处理器中抛出ValidationException。 问题是,在引发验证异常之前的所有有效行都被跳过,写入程序无法使用。在本例中,是第1行和第2行

    下面是作业配置

    <beans:import resource="JobContext.xml" />
    
        <!-- Starting point of the feed runner -->
        <beans:bean id="feedJobRunner" class="com.ubs.risk.arisk.job.FeedJobRunner" >
                <beans:constructor-arg name="jobLauncher" ref="jobLauncher"/>
                <beans:constructor-arg name="job" ref="feedJob"/>
                <beans:constructor-arg name="feedDao" ref="feedDao"/>
        </beans:bean>
    
       <beans:bean id="feedReader" class="com.ubs.risk.arisk.job.batch.FeedReaderDelegate" scope="step">
           <beans:constructor-arg>
                <beans:bean class="org.springframework.batch.item.file.FlatFileItemReader">
                    <beans:property name="resource" value="#{jobParameters['inputResource']}"/>
                    <beans:property name="linesToSkip" value="1"/>
                    <beans:property name="lineMapper">
                        <beans:bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
                            <beans:property name="lineTokenizer">
                                <beans:bean class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
                                    <beans:property name="delimiter"  >
                                        <util:constant static-field="org.springframework.batch.item.file.transform.DelimitedLineTokenizer.DELIMITER_TAB" />
                                    </beans:property>
                                    <beans:property name="names" value="#{jobParameters['fieldNames']}"/>
                                    <beans:property name="strict" value="false"/>
                                </beans:bean>
                            </beans:property>
                            <beans:property name="fieldSetMapper" >
                                <beans:bean class="com.ubs.risk.arisk.job.batch.FeedFieldSetMapper"/>
                            </beans:property>
                        </beans:bean>
                    </beans:property>
                </beans:bean>
           </beans:constructor-arg>
       </beans:bean>
    
        <beans:bean id="feedProcessor" class="com.ubs.risk.arisk.job.batch.FeedRowProcessor" scope="step" >
            <beans:constructor-arg name="feedDao" ref="feedDao" />
            <beans:constructor-arg name="stepExecution" value="#{stepExecution}"/>
        </beans:bean>
    
        <beans:bean id="feedWriter" class="com.ubs.risk.arisk.job.batch.FeedWriter" scope="step">
            <beans:constructor-arg name="dataSource" ref="dataSource" />
        </beans:bean>
    
        <job id="feedJob">
                <step id="importFeedStep">
                    <tasklet task-executor="stepExecutor" throttle-limit="10">
                            <chunk reader="feedReader" processor="feedProcessor" writer="feedWriter"  commit-interval="300"  skip-limit="100"  >
                               <skippable-exception-classes>
                                    <include class="com.ubs.risk.arisk.job.batch.exception.FeedValidationException"/>
                                </skippable-exception-classes>
    
                                <listeners>
                                        <listener>
                                                <beans:bean class="com.ubs.risk.arisk.job.batch.listener.FeedSkipListener">
                                                    <beans:property name="feedDao"  ref="feedDao"/>
                                                </beans:bean>
                                        </listener>
                                </listeners>
                            </chunk>
                    </tasklet>
                    <listeners>
                        <listener >
                            <beans:bean id="feedStepListener" class="com.ubs.risk.arisk.job.batch.listener.FeedStepListener">
                                <beans:constructor-arg name="feedDao" ref="feedDao" />
                            </beans:bean>
                        </listener>
                    </listeners>
                </step>
    
            <listeners>
                <listener>
                    <beans:bean id="feedJobListener" class="com.ubs.risk.arisk.job.batch.listener.FeedJobListener">
                        <beans:constructor-arg name="processDao">
                            <beans:bean class="com.ubs.risk.arisk.job.batch.dao.JdbcProcessDao">
                                <beans:property name="dataSource" ref="dataSource"/>
                            </beans:bean>
                        </beans:constructor-arg>
                    </beans:bean>
                </listener>
            </listeners>
            <validator ref="jobParamValidator"/>
        </job>
    
        <beans:bean id="stepExecutor" class="org.springframework.core.task.SimpleAsyncTaskExecutor" />
    
        <beans:bean id="jobParamValidator" class="com.ubs.risk.arisk.job.batch.validation.JobParameterValidator"/>
    
    
    

    提前感谢您的建议。

    这是默认的Spring批处理“跳过机制”行为。我建议您阅读Spring batch文档的§5.1.5至§5.1.7和§6.3.2至§6.3.3:谢谢。我知道对此做出回应有点晚。我理解了这个概念,并根据我的要求修改了代码。