ввод количества строк в заголовок плоского файла

Я использую spring-batch для создания отчетов плоских файлов на основе данных БД. Формат flat файла похож на один ниже

HEADER1 (имя файла)
HEADER2 (содержит количество записей)
HEADER3 (имена столбцов)
RECORD1
RECORD2
RECORDN
Футер
Я использую интерфейсы FlatFileHeaderCallback и FlatFileHeaderCallback для записи верхнего и нижнего колонтитулов соответственно. Я могу вставить количество строк в нижний колонтитул, но когда я пытаюсь записать его в заголовок, его пересчет 0.





Пишущая машина:

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 ответ

  1. Я могу вставить количество строк в нижний колонтитул, но когда я пытаюсь
    запишите в заголовок ее returning 0.

    на момент создания заголовка значение равно 0, так как элементы еще не считаны / не обработаны / не записаны

    чтобы решить проблему, я бы пошел с

    • TaskletStep, на котором выполняется выбор количества.. SQL для получения количества входных данных
    • использование ExecutionContext для хранения значения
    • используйте значение существующего шага, чтобы записать его в заголовок

    другим решением может быть использование другого ориентированного на фрагмент шага, который читает и записывает созданный файл снова, изменяя только нужное значение