troubleshooting Question

Spring Batch: Include count of records in File Header.

Avatar of Prashant Vasha
Prashant VashaFlag for India asked on
Java* Spring* Spring Framework
1 Comment1 Solution213 ViewsLast Modified:
I am writing a standalone application using Spring Batch. The below is my batch job configuration:
<batch:job id="sampleBatchJob">
        <batch:step id="createFile">
            <tasklet>
                <batch:chunk reader="sampleReader" writer="sampleFileWriter" processor="sampleRecordProcessor" commit-interval="500"/>
            </tasklet>
        </batch:step>
        <batch:listeners>
            <batch:listener ref="sampleStepExecutionListener" />
            <batch:listener ref="executionContextPromotionListener" />
        </batch:listeners>
    </batch:job>
    <bean id="executionContextPromotionListener"
          class="org.springframework.batch.core.listener.ExecutionContextPromotionListener">
        <property name="keys" value="recordCount" />
    </bean>
    <bean id="outputResource" class="org.springframework.core.io.ClassPathResource">
        <constructor-arg type="java.lang.String" value="sample.csv" />
    </bean>

    <bean id="sampleReader" class="test.SampleDataItemReader" scope="step"/>

    <bean id="sampleFileWriter" class="org.springframework.batch.item.file.FlatFileItemWriter" scope="step">
        <property name="resource" ref="outputResource"/>
        <property name="shouldDeleteIfExists" value="true" />
        <property name="headerCallback" ref="sampleFileWriterCallback" />
        <property name="lineAggregator">
            <bean class="test.SampleCustomLineAggregator" >
                <property name="delimiter" value="," />
            </bean>
        </property>
    </bean>

    <bean id="sampleFileWriterCallback" class="test.SampleFileHeaderWriterCallback"/>

    <bean id="sampleRecordProcessor" class="test.SampleRecordProcessor"/>

    <bean id="sampleStepExecutionListener" class="test.SampleStepExecutionListener"/>

I have to include the count of records in the File Header and for the same I have declared a property "recordCount" in executionContextPromotionListener. I am setting the value for the property in the ItemReader implementation using the ExecutionContext.

But before the ItemReader is invoked, the Header Callback for the ItemWriter is invoked and the writeHeader(Writer) is executed. Also, I do not have access to the ExecutionContext object when the writeHeader(Writer) is executed.

Any suggestions, how I can pass the value from the reader to the FileHeaderWriterCallBack implementation?
ASKER CERTIFIED SOLUTION
Prashant Vasha

Our community of experts have been thoroughly vetted for their expertise and industry experience.

Join our community to see this answer!
Unlock 1 Answer and 1 Comment.
Start Free Trial
Learn from the best

Network and collaborate with thousands of CTOs, CISOs, and IT Pros rooting for you and your success.

Andrew Hancock - VMware vExpert
See if this solution works for you by signing up for a 7 day free trial.
Unlock 1 Answer and 1 Comment.
Try for 7 days

”The time we save is the biggest benefit of E-E to our team. What could take multiple guys 2 hours or more each to find is accessed in around 15 minutes on Experts Exchange.

-Mike Kapnisakis, Warner Bros