Hi Dave, thanks for trying too help me.
At the begining I thought the same, for that reason I post other job without a custom reader implementation.
Here is a job development with 2.1.0.M1. Without custom readers.
The classes defined by me in this job are just, the Processor (Which thows the exception) , a Listener a FieldSetMapper a Pojo item to be process (File record).
Here is the main job definition, I also attached the whole job and container definition, a couple of files, and a log file in case that you need them.
Code:
<job id="validadorMD5Job" job-repository="simpleJobRepository" >
<step id="validarMD5Step" >
<tasklet >
<chunk reader="validadorMD5StepItemReader"
processor="validadorMD5StepItemProcessor"
writer="validadorMD5StepItemWriter"
commit-interval="50"
skip-limit="10"
>
<streams>
<stream ref="validadorMD5StepItemReader"/>
</streams>
<skippable-exception-classes merge="true">
<include class="java.io.FileNotFoundException" />
</skippable-exception-classes>
</chunk>
<listeners>
<listener ref="comunicarErroresRem" />
</listeners>
</tasklet>
</step>
</job>
Reader , writer processor and listener
Code:
<beans:bean id="comunicarErroresRem" class="com.swissmedical.rem.batch.item.listeners.ErrorLogListener">
</beans:bean>
<beans:bean id="itemReaderParent" class="org.springframework.batch.item.file.MultiResourceItemReader" abstract="true">
<beans:property name="delegate">
<beans:bean class="org.springframework.batch.item.file.FlatFileItemReader">
<beans:property name="lineMapper">
<beans:bean class="org.springframework.batch.item.file.mapping.PatternMatchingCompositeLineMapper">
<beans:property name="tokenizers">
<beans:map>
<beans:entry key="rem*" value-ref="headerRecordTokenizer" />
<beans:entry key="documentos*" value-ref="customRecordTokenizer" />
</beans:map>
</beans:property>
<beans:property name="fieldSetMappers">
<beans:map>
<beans:entry key="rem*" value-ref="fieldSetMapper" />
<beans:entry key="documentos*" value-ref="fieldSetMapper" />
</beans:map>
</beans:property>
</beans:bean>
</beans:property>
</beans:bean>
</beans:property>
</beans:bean>
<beans:bean id="validadorMD5StepItemReader" parent="itemReaderParent" scope="step" autowire-candidate="false" >
<beans:property name="resources" value="${validadorMD5Job.workingDirectory}/*.md5" />
</beans:bean>
<beans:bean id="validadorMD5StepItemProcessor" class="com.swissmedical.rem.batch.item.processor.ValidadorMD5ItemProcessor">
</beans:bean>
<beans:bean id="validadorMD5StepItemWriter" class="com.swissmedical.rem.batch.item.writer.ValidadorMD5ItemWriter">
</beans:bean>
Mappers and tokenizers
Code:
<beans:bean id="headerRecordTokenizer" class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
<beans:property name="delimiter" value=">"/>
<beans:property name="names" value="nombreArchivo,md5Code" />
</beans:bean>
<beans:bean id="customRecordTokenizer" class="org.springframework.batch.item.file.transform.FixedLengthTokenizer">
<beans:property name="names" value="nombreArchivo,separador,md5Code" />
<beans:property name="columns" value="1-48,49-58,59-90" />
</beans:bean>
<beans:bean id="fieldSetMapper" class="com.swissmedical.rem.batch.item.mapper.md5.TxtRecordMD5Mapper" />
If you check the log file you will see that the process always ends when the skip limit is reached. (It doesn't matter if it's 1 or 1000...)
Note: Nowadays I'm using a FileNotFoundException just to try to solve this, but the idea is to use a ProccesingException (Cutom Exception implementation) for all the jobs to log the errors against a service