Не найденный ресурс для FlatFileItemReader после перемещения файла

Я использую Spring Batch для чтения из файла CSV и записи строк на экране. Моя работа состоит из 3 частей: Часть 1. Проверьте, существует ли файл CSV в каком-либо каталоге INPUT на моем диске, и если он возвращает TRUE, файл будет перемещен в другой каталог с именем PROD. Часть 2: Извлечение данных из файла CSV с помощью FlatFileItemReader. Часть 3: Запишите все элементы на экран.

Проблема заключается в бросках FlatFileItemReader org.springframework.batch.item.ItemStreamException: Failed to initialize the reader вызванный java.lang.IllegalArgumentException: Input resource must be set

Вот мой код:

@Bean
public FlatFileItemReader<UniversInvestissement> reader() {
    FlatFileItemReader<UniversInvestissement> reader = new FlatFileItemReader<>();
    File csvFile = new File("C://INPUT/data.csv");
    Resource resource = resourceLoader.getResource("file:" + csvFile.getAbsolutePath());
    reader.setLinesToSkip(1);
    reader.setResource(resource);
    DefaultLineMapper lineMapper = new DefaultLineMapper();

    DelimitedLineTokenizer tokenizer = new DelimitedLineTokenizer();
    tokenizer.setNames(new String[]{"COL1", "COL2", "COL3", "COL4"});
    tokenizer.setDelimiter(";");

    FieldSetMapper fieldSetMapper = new UniversInvestissementFieldSetMapper();
    lineMapper.setLineTokenizer(tokenizer);
    lineMapper.setFieldSetMapper(fieldSetMapper);

    reader.setLineMapper(lineMapper);

    reader.setEncoding("Cp1252");
    return reader;
}

@Bean
public UniversInvestissementWriter writer() {
    return new UniversInvestissementWriter();
}

@Bean
public UniversInvestissementProcessor processor() {
    return new UniversInvestissementProcessor();
}

@Bean
public Step extractData() {
    return steps.get("extractData")
            .<UniversInvestissement, UniversInvestissementProcessorResult>chunk(1)
            .reader(reader())
            .processor(processor())
            .writer(writer())
            .build();
}

На самом деле проблема в том, что когда FlatFileItemReader инициализирован, он не может найти файл CSV как ресурс! Есть ли способ отложить назначение ресурса и избежать этого исключения?

3 ответа

Ты можешь использовать reader.setStrict(false); если вы установите строгий режим в false, читатель не будет выдавать исключение. Возможно, вам придется использовать @StepScope сделать читателя ленивым. Я использую ту же настройку, и она работает нормально для меня, надеюсь, это поможет вам

Убедитесь, что файл CSV существует в некотором каталоге INPUT на моем диске, и если он возвращает TRUE, файл будет перемещен в другой каталог с именем PROD

Эта проблема может быть легко решена с помощью JobExecutionDecider

class Checker implements JobExecutionDecider {
  FlowExecutionStatus decide(...) {
    if(<file not found in INPUT/ dir>) {
      return FlowExecutionStatus.STOPPED;
    }
    if(!<copy file from INPUT/ to PROD/ works>) {
      return FlowExecutionStatus.FAILED;
    }
    return FlowExecutionStatus.COMPLETED;
  }
}

Конечно, extractData() должен быть изменен, чтобы вставить использование программного решения потока (проверьте здесь для простого примера)

Я думаю, что проблема в вашем resourceLoaderпотому что такое исключение выдается ненулевым утверждением экземпляра ресурса. Так что вы resourceLoader вернуть нулевое значение.

Попробуй использовать FileSystemResource и без каких-либо загрузчиков ресурсов. Например:

reader.setResource(new FileSystemResource(csvFile));
Другие вопросы по тегам