-
Oct 5th, 2012, 04:32 AM
#1
Error using two FlatFileItemReaders in the same batch job - Simple batch template
Hi,
I have a batch application that is built on top of the simple batch template project in STS 2.9.0. I am using Spring 3.1 in my application.
In my application context I have defined two seperate FlatFileItemReader beans with different IDs as per the XML below.
The problem is that when I run the job, I get this error:
org.springframework.batch.item.file.FlatFileParseE xception: Parsing error at line: 2 in resource=[file [c:\Loader\sets\users.csv]], input=[111111,111111,Manager,Active]
at org.springframework.batch.item.file.FlatFileItemRe ader.doRead(FlatFileItemReader.java:182)
at org.springframework.batch.item.support.AbstractIte mCountingItemStreamItemReader.read(AbstractItemCou ntingItemStreamItemReader.java:85)
at org.springframework.batch.item.file.MultiResourceI temReader.readNextItem(MultiResourceItemReader.jav a:133)
at org.springframework.batch.item.file.MultiResourceI temReader.read(MultiResourceItemReader.java:108)
at org.springframework.batch.core.step.item.SimpleChu nkProvider.doRead(SimpleChunkProvider.java:90)
at org.springframework.batch.core.step.item.SimpleChu nkProvider.read(SimpleChunkProvider.java:148)
........
.........
org.springframework.batch.item.file.transform.Inco rrectTokenCountException: Incorrect number of tokens found in record: expected 3 actual 4
at org.springframework.batch.item.file.transform.Abst ractLineTokenizer.tokenize(AbstractLineTokenizer.j ava:123)
at org.springframework.batch.item.file.mapping.Defaul tLineMapper.mapLine(DefaultLineMapper.java:42)
at org.springframework.batch.item.file.FlatFileItemRe ader.doRead(FlatFileItemReader.java:179)
... 59 more
So, the tokenizer codeReader bean works as expected and maps the three fields defined in it's tokenizer "name" property but even though I have defined two different FlatFileItemReaders, it looks like the same DelimitedLineTokenizer is then being used for the userReader. To prove this, I changed the "names" property in the codeReader tokenizer so that it only had two values (value="REF-CODE-NAME,REF-CODE-FULL-DESCRIPTION"), and the stack trace changes to read
org.springframework.batch.item.file.transform.Inco rrectTokenCountException: Incorrect number of tokens found in record: expected 2 actual 4
So my question is this. Is this the expected behaviour in that both FlatFileItemReaders will share one tokenizer, even if these tokenizers are definied as seperate beans and if so how can I get around it? I tried to create a subclass of FlatFileItemReader and instantiate a new tokenizer within it's constructor but I still get the same problem.
Any help would be much appreciated. Also this is my first post so go easy on me if I have ommited anything ;-)
APP-CONTEXT Extract
BEAN 1
<bean id="codeReader" class="org.springframework.batch.item.file.FlatFil eItemReader">
<property name="linesToSkip" value="1" />
<property name="lineMapper">
<bean
class="org.springframework.batch.item.file.mapping .DefaultLineMapper">
<property name="lineTokenizer">
<bean class="org.springframework.batch.item.file.transfo rm.DelimitedLineTokenizer">
<property name="names" value="REF-CODE-NAME,REF-CODE-FULL-DESCRIPTION,REF-CODE-HIGH-VALUE" />
</bean>
</property>
<property name="fieldSetMapper" ref="codeFieldSetMapper"></property>
</bean>
</property>
</bean>
<bean id="codeFieldSetMapper" class="mypackage.CodeFieldSetMapper">
<property name="multiItemReader" ref="codesetFileReader"/>
</bean>
BEAN 2
<bean id="userReader" class="org.springframework.batch.item.file.FlatFil eItemReader">
<property name="resource" value="${app.guiuserfile}" />
<property name="linesToSkip" value="1" />
<property name="lineMapper" ref="userLineMapper"/>
</bean>
<bean id="userLineMapper" class="org.springframework.batch.item.file.mapping .DefaultLineMapper">
<property name="lineTokenizer" ref="userLineTokenizer"/>
<property name="fieldSetMapper" ref="userFieldSetMapper"/>
</bean>
<bean id="userLineTokenizer" class="org.springframework.batch.item.file.transfo rm.DelimitedLineTokenizer">
<property name="names" value="BADGEID,USERNAME,ROLE,STATUS" />
</bean>
<bean id="userFieldSetMapper" class="mypackage.UserFieldSetMapper"/>
Module-context.xml
<batch:job id="job1" >
<batch:step id="step1" next="step2" >
<batch:tasklet transaction-manager="transactionManager" start-limit="100" >
<batch:chunk reader="codeReader" processor="codeProcessor" writer="writer" commit-interval="50" />
</batch:tasklet>
</batch:step>
<batch:step id="step2" >
<batch:tasklet transaction-manager="transactionManager" start-limit="100" >
<batch:chunk reader="userReader" processor="userItemProcessor" writer="xmlItemWriter" commit-interval="50" />
</batch:tasklet>
</batch:step>
</batch:job>
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules