Не найденный ресурс для 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));