2012-01-11 36 views
1

私はdb to fileジョブを持っています。ファイルとジョブの出力ファイルにヘッダとフッタを書き込む

<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> 

ステップは以下の通りである:

項目ライタは以下の通りである

<step id="ReportFileGenerator"> 
     <tasklet transaction-manager="jobRepository-transactionManager"> 
      <chunk reader="ReportFileItemReader" writer="myReportFooterCallback" commit-interval="1000"/> 
     </tasklet> 
</step> 

クラスMyReportFooterCallbackは以下の通りである:

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)output_report.datファイルは7つの列で生成されますが、フッターには合計値が表示されません。 4つの値はすべて0(カウントと合計)です。

私には何が欠けていますか?

2)また、各列の先頭に列名を追加することはできますか?

3)出力レポートにページ番号を追加する方法はありますか?

読んでいただきありがとうございます!同様の例との迅速な試みが(でもステップスコープなし)*問題なく私の作品

答えて

0

1)あなたはそれが動作を確認するためにJUnitテストを試してみたのですか?次のステップは必ず、HeaderCallbackは

3があまりにも存在する)/ログ

2をデバッグすることになる)ない箱から出して、ページサイズによってtotalCountプロパティ、除算を使用し、それを実装することも難しくはありませんその結果、全体の数である場合は、項目の後に印刷

(*)あなたの例は、私が行方不明になった何だったのストリーム

+0

としてmyReportFileItemWriterを登録しなければならなかった、完全ないないようです:Dのおかげで...それをいくつかのアイテムデータがヘッダーで使用される機会が数多くあります(たとえば、日付など)。残念なことに、私たちはヘッダーコールバックを通してそれを行うことはできません:( – Nik

関連する問題