私は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)出力レポートにページ番号を追加する方法はありますか?
読んでいただきありがとうございます!同様の例との迅速な試みが(でもステップスコープなし)*問題なく私の作品
としてmyReportFileItemWriterを登録しなければならなかった、完全ないないようです:Dのおかげで...それをいくつかのアイテムデータがヘッダーで使用される機会が数多くあります(たとえば、日付など)。残念なことに、私たちはヘッダーコールバックを通してそれを行うことはできません:( – Nik