FlatFileItemWriterBuilder-headerCallback () получить количество записанных строк - PullRequest
0 голосов
/ 28 января 2020

Можно ли получить общее количество строк, записанных из FlatFileItemWriter.headerCallback()?

Я - nubee-пакетник, и я посмотрел на , помещая количество строк в заголовок плоского файла и Spring Batch - Подсчет обработанных рядов . Однако я не могу реализовать логи c, используя приведенный там совет. Имеет смысл подсчет писателя, который будет доступен только после обработки файла. Однако я пытаюсь подсчитать количество строк непосредственно перед тем, как файл будет официально записан.

Я попытался найти хук типа @AfterStep и захватить все строки, но я продолжаю идти кругами.

@Bean
@StepScope
public FlatFileItemWriter<MyFile> generateMyFileWriter(Long jobId,Date eventDate) {
    String filePath = "C:\MYFILE\COMPLETED";
    Resource file = new FileSystemResource(filePath);

    DelimitedLineAggregator<MyFile> myFileLineAggregator = new DelimitedLineAggregator<>();
    myFileLineAggregator.setDelimiter(",");
    myFileLineAggregator.setFieldExtractor(getMyFileFieldExtractor());

    return new FlatFileItemWriterBuilder<MyFile>()
            .name("my-file-writer")
            .resource(file)
            .headerCallback(new MyFileHeaderWriter(file.getFilename()))
            .lineAggregator(myFileLineAggregator)
            .build();
}

private FieldExtractor<MyFile> getMyFileFieldExtractor() {
    final String[] fieldNames = new String[]{
            "typeRecord",
            "idSystem"               
    };  
    return item -> {
        BeanWrapperFieldExtractor<MyFile> extractor = new BeanWrapperFieldExtractor<>();
        extractor.setNames(fieldNames);
        return extractor.extract(item);
    };
}

Уведомление Я использую класс MyFileHeaderWriter.java (ниже) в headerCallback(new MyFileHeaderWriter(file.getFilename())) (выше). Я пытаюсь инициализировать значение qtyRecordsCreated ниже.

class MyFileHeaderWriter implements FlatFileHeaderCallback {

 private final String header;

 private String dtxCreated;
 private String tmxCreated;
 private String fileName;//15 byte file name    private String qtyRecordsCreated;//number of rows in file including the header row

 MyFileHeaderWriter(String sbfFileName) {
    SimpleDateFormat dateCreated = new SimpleDateFormat("YYDDD");
    SimpleDateFormat timeCreated = new SimpleDateFormat("HHMM");
    Date now = new Date(); 

    this.dtxCreated = dateCreated.format(now);
    this.tmxCreated = timeCreated.format(now);
    this.fileName = sbfFileName;        this.qtyRecordsCreated="";  

    String[] headerValues = {dtxCreated,tmxCreated,fileName,qtyRecordsCreated};
     this.header = String.join(",", headerValues);
 }

 @Override
 public void writeHeader(Writer writer) throws IOException {
     writer.write(header);
 }
}

Как узнать количество строк в строке заголовка? Можно ли использовать FlatFileFooterCallback для получения количества строк и последующего обновления заголовка числом строк в файле?

1 Ответ

0 голосов
/ 29 января 2020

Вы можете достичь этого в ItemProcessor, попробуйте это, это сработает для меня

public class EmployeeProcessor implements ItemProcessor<Employee, Employee> {
    @Override
    public Employee process(Employee employee) throws Exception {

         return employee;
    }

     @AfterStep
    public void afterStep(StepExecution stepExecution) {
      ExecutionContext stepContext = stepExecution.getExecutionContext();
      stepContext.put("count",  stepExecution.getReadCount());
      System.out.println("COUNT" + stepExecution.getReadCount());
    }
}

И у вас, писатель, вы получите значение

int count = stepContext.getInt("count");

Надеюсь, что работа для вас

...