####Spring Batch application contains 2 step jobs
#####1 reading from csv file and writing to mysql db <batch:step id="step1"> batch:tasklet <batch:chunk reader="cvsFileItemReader" writer="mysqlItemWriter" processor="itemProcessor" commit-interval="1"> </batch:chunk> </batch:tasklet> </batch:step>
first check reader="cvsFileItemReader"
<property name="resource" value="classpath:cvs/report.csv"/> <property name="lineMapper"> <bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper"> <property name="lineTokenizer"> <bean class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer"> <property name="names" value="id,name,surname,transaction,date"/> </bean> </property> <property name="fieldSetMapper"> <bean class="rashjz.info.mapper.ReportFieldSetMapper"/> </property> </bean> </property> </bean> here we used lineMapper - org.springframework.batch.item.file.mapping.DefaultLineMapper class that reads lines for delimiter for sequence on names property then maps all this values to our Report class step goes to writer:
<bean id="mysqlItemWriter" class="org.springframework.batch.item.database.JdbcBatchItemWriter"> <property name="dataSource" ref="dataSource"/> <property name="sql"> <value> <![CDATA[ insert into JOB_REPORT(id,name,surname,transaction,date) values (?, ?, ?, ?, ?) ]]> </value> </property> <property name="ItemPreparedStatementSetter"> <bean class="rashjz.info.job.ReportItemPreparedStatementSetter"/> </property> </bean> and writer initialize datasource and sql query then invokes PreparedStatement to write to db #####2 reading from db and wiriting to xml file step 2 like a step 1 we must first read data here we start to read data from mysql db and then write to xml file
<batch:step id="step2"> <batch:tasklet> <batch:chunk reader="itemReader" writer="itemWriter" processor="itemProcessor" commit-interval="1"> </batch:chunk> </batch:tasklet> </batch:step> <bean id="itemReader" class="org.springframework.batch.item.database.JdbcCursorItemReader" scope="step"> <property name="dataSource" ref="dataSource"/> <property name="sql" value="SELECT id,name,surname,transaction,date FROM JOB_REPORT"/> <property name="rowMapper"> <bean class="rashjz.info.mapper.ReportRowMapper"/> </property> </bean> <bean id="itemWriter" class="org.springframework.batch.item.xml.StaxEventItemWriter"> <property name="resource" value="classpath:xml/report.xml"/> <property name="rootTagName" value="reports"/> <property name="marshaller" ref="userUnmarshaller"/> </bean> <bean id="userUnmarshaller" class="org.springframework.oxm.xstream.XStreamMarshaller"> <property name="aliases"> <util:map id="aliases"> <entry key="report" value="rashjz.info.model.Report"/> </util:map> </property> </bean> for itemWriter we declare rootTagName for xml file and marshaller for xml file writer and inside resource of course we put our directory for xml files
#####3 junit testing for batch jobs at first we must add bean
<bean class="org.springframework.batch.test.JobLauncherTestUtils"/> to job-report.xml file then @Autowired JobLauncherTestUtils inside AppTest.class assertEquals(BatchStatus.COMPLETED, jobExecution.getStatus()); in this step we check status of our running jobs