Spring batch Spring批处理在遇到可跳过的异常之前忽略已处理的行
您好,我是Spring batch的新手,使用版本3.0.4.RELEASE让我的POC处理一个非常大的平面文件,如下所示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
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:谢谢。我知道对此做出回应有点晚。我理解了这个概念,并根据我的要求修改了代码。