将行数计入平面文件的标题

时间:2016-05-26 10:53:49

标签: spring-batch

我正在使用spring-batch来创建基于数据库数据的平面文件报告。平面文件的格式类似于

下面的格式

HEADER1(文件名) HEADER2(包含记录数)
HEADER3(列名)
RECORD1
RECORD2
RECORDN
页脚
我正在使用FlatFileHeaderCallback和FlatFileHeaderCallback接口来相应地编写页眉和页脚。我可以在FOOTER中插入行计数,但是当我试图在Header中写入它时,它会停止0。

FileWriter的:

private String templateDelimiter;
private String fileName;
private int rowCount = 0;
private String headerTemplate;
private String footerTemplate;
private String columnHeaders;

private Map<String, String> templateProps;

private FlatFileItemWriter<String[]> delegate;    


public void writeFooter(Writer writer) throws IOException {
    if (footerTemplate != null) {
        initializeTemplateProps();
        templateProps.put(Constant.TEMPLATE_DELIMITER + Constant.ROWCOUNT + Constant.TEMPLATE_DELIMITER, "" + rowCount);
        writer.write(TextTemplate.merge(footerTemplate, templateProps));
    }
}

public void writeHeader(Writer writer) throws IOException {
    if (headerTemplate != null) {
        initializeTemplateProps();      
        writer.write(TextTemplate.merge(headerTemplate, templateProps));
    }
}

protected void initializeTemplateProps() {
    if (templateProps == null) {
        templateProps = new HashMap<String, String>();
        templateProps.put(Constant.TEMPLATE_DELIMITER + Constant.FILENAME + Constant.TEMPLATE_DELIMITER, fileName);
        templateProps.put(Constant.TEMPLATE_DELIMITER + Constant.SCHEDULE_DATE + Constant.TEMPLATE_DELIMITER, System.getProperty(Constant.SCHEDULE_DATE));
        templateProps.put(Constant.TEMPLATE_DELIMITER + Constant.COLUMNHEADER + Constant.TEMPLATE_DELIMITER, columnHeaders);
        templateProps.put(Constant.TEMPLATE_DELIMITER + Constant.NEWLINE + Constant.TEMPLATE_DELIMITER, System.lineSeparator()); 
        templateProps.put(Constant.TEMPLATE_DELIMITER + Constant.PSV_FILE_HEADER + Constant.TEMPLATE_DELIMITER + 
                Constant.TEMPLATE_DELIMITER+Constant.NEWLINE + Constant.TEMPLATE_DELIMITER+Constant.TEMPLATE_DELIMITER+Constant.COLUMNHEADER+Constant.TEMPLATE_DELIMITER,headerTemplate);
    }
    templateProps.put(Constant.TEMPLATE_DELIMITER + Constant.ROWCOUNT + Constant.TEMPLATE_DELIMITER, "" + rowCount);
}

public void write(List<? extends String[]> items) throws Exception {        
    rowCount += items.size();
    delegate.write(items);
}   

1 个答案:

答案 0 :(得分:0)

  

我可以在FOOTER中插入行计数,但是当我尝试时   把它写在Header中它的回归0。

在创建标题时,值为0,因为尚未读取/处理/写入任何项目

解决问题我会选择

  • 一个TaskletStep,它运行SELECT COUNT .. SQL来获取输入计数
  • 使用ExecutionContext存储值
  • 使用现有步骤中的值将其写入标题

另一种解决方案可能是使用另一个面向块的步骤,该步骤再次读取和写入创建的文件,仅更改所需的值

相关问题