I have a db to file job.
The item writer is as below:
And the step is as below:Code:<beans:bean id="myReportFooterCallback" class="com.myPackage.util.MyReportFooterCallback"> <beans:property name="delegate" ref="myReportFileItemWriter" /> </beans:bean> <beans:bean id="myReportFileItemWriter" class="org.springframework.batch.item.file.FlatFileItemWriter" scope="step"> <beans:property name="resource" value="file:c:\TestData\output_report.dat" /> <beans:property name="lineAggregator"> <beans:bean class="org.springframework.batch.item.file.transform.FormatterLineAggregator"> <beans:property name="fieldExtractor"> <beans:bean class="org.springframework.batch.item.file.transform.BeanWrapperFieldExtractor"> <beans:property name="names" value="BUSINESS_DATE, FIELD_ONE, FIELD_TWO, FIELD_THREE, FIELD_FOUR, FIELD_FIVE, FIELD_SIX " /> </beans:bean> </beans:property> <beans:property name="format" value="%-12s%-20s%-20s%-20s%-5s%-5s%-10s" /> </beans:bean> </beans:property> <beans:property name="footerCallback" ref="myReportFooterCallback" /> </beans:bean>
The class MyReportFooterCallback is as below:Code:<step id="ReportFileGenerator"> <tasklet transaction-manager="jobRepository-transactionManager"> <chunk reader="ReportFileItemReader" writer="myReportFooterCallback" commit-interval="1000"/> </tasklet> </step>
However, above code is not working as expected:Code:public class MyReportFooterCallback implements ItemWriter<MyReportBean>, FlatFileFooterCallback { private ItemWriter<MyReportBean> delegate; private double totalDebitAmount = 0.0; private double totalCreditAmount = 0.0; private int totalDebit = 0; private int totalCredit = 0; public void write(final List<? extends MyReportBean> items) throws Exception { System.out.println("in write method!"); int chunkDebitCount = 0; int chunkCreditCount = 0; double chunkDebitTot = 0.0; double chunkCreditTot = 0.0; for (MyReportBeanitem : items) { if (item.getIndicator().equalsIgnoreCase("Debit")) { // its a debit chunkDebitCount = chunkDebitCount + 1; chunkDebitTot = chunkDebitTot + Double.parseDouble(item.getTRANS_AMT()); } else { // its a credit chunkCreditCount = chunkCreditCount + 1; chunkCreditTot = chunkCreditTot + Double.parseDouble(item.getTRANS_AMT()); } } this.delegate.write(items); this.totalDebit = this.totalDebit + chunkDebitCount; this.totalDebitAmount = this.totalDebitAmount + chunkDebitTot; this.totalCredit = this.totalCredit + chunkCreditCount; this.totalCreditAmount = this.totalCreditAmount + chunkCreditTot; } public void writeFooter(final Writer writer) throws IOException { writer.write("\n"); writer.write("\n"); writer.write("Total Debits Processed: " + this.totalDebit); writer.write("\n"); writer.write("Total Debit Amount: " + this.totalDebitAmount); writer.write("\n"); writer.write("\n"); writer.write("Total Credits Processed: " + this.totalCredit); writer.write("\n"); writer.write("Total Credit Amount: " + this.totalCreditAmount); } public void setDelegate(final ItemWriter<MyReportBean> delegate) { this.delegate = delegate; } }
1) The file output_report.dat gets generated with the seven columns.However, the footer doesn't show the total values. All four values are 0 (the count and the total).
Total Debits Processed: 0
Total Debit Amount: 0.0
Total Credits Processed: 0
Total Credit Amount: 0.0
What am I missing ?
2) Also, is it possible to add the column names to the top of each column ?
3) Any way to add page numbers to the output report ?
Thanks for reading!


Reply With Quote
