Динамическое изменение имени выходного файла Excel при импорте его с помощью spring batch framework

#spring-boot #spring-batch

Вопрос:

У меня есть пакетное приложение spring, которое импортирует файлы excel и создает выходной файл excel со столбцом состояния, который может быть успешным или неудачным. В настоящее время приложение является рабочим файлом. Ниже приведен код для подготовки параметров задания

 JobParameters jobParametersBuilder = new JobParametersBuilder().addString(TYPE, type)
    .addString(NAME, name).addString(FULL_PATH_FILE_NAME, filePath)
    .addLong(TIME, System.currentTimeMillis()).addString(OUTPUT_FILE_NAME, outputFile)
    .addString(INPUT_FILE_NAME, inputFile).toJobParameters();
 

Как вы можете видеть, я указал имя выходного файла в параметрах.
Теперь, как упоминалось выше, в столбце статус выходных файлов Excel может быть два значения с может прийти. Есть ли какой-либо способ изменить имя файла output, если в столбце состояние есть некоторые ошибки

например: если в каком-либо столбце состояния нет ошибок, то имя вывода должно совпадать с предыдущим выводом-xyz_currentTimeStamp (имя образца), но если в столбце состояния есть ошибка, то имя файла должно быть выводом/ошибкой-xyz_currentTimeStamp (имя образца).

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

введите описание изображения здесь

Комментарии:

1. Как рассчитывается/определяется этот статус? Пожалуйста, приведите пример с конкретными файлами ввода/вывода, чтобы они могли эффективно помочь вам.

2. Я добавил выходной файл. Входной файл такой же без столбца состояния. Если определенная строка в excel успешно сохранена в базе данных, то в выходном файле будет задан столбец состояния «УСПЕШНО» для этой конкретной строки, иначе может возникнуть какое-то исключение, например ошибка проверки, тогда это конкретное исключение будет задано в столбце состояния. Теперь предположим, что файл содержит исключение, тогда мы сможем назвать этот файл так, как указано выше в вопросе.

Ответ №1:

У вас есть два варианта:

  1. Заранее определите, что по крайней мере одна из строк, которые будут записаны, будет иметь статус «Исключение», и динамически настройте средство записи с правильным именем файла. Вы можете создать Tasklet шаг, который выполняет проверку и помещает информацию в контекст выполнения. Следующий шаг, ориентированный на фрагменты, может использовать средство записи с областью действия, которое динамически настраивается с предварительно вычисленным именем файла из контекста выполнения, что-то вроде:
 @Bean
@StepScope
public FlatFileItemWriter itemWriter(@Value("#{jobExecutionContext['fileName']}") String fileName) {
    return new FlatFileItemWriterBuilder()
            .resource(new FileSystemResource(fileName))
            // set other properties
            .build();
}
 
  1. Используйте следующий шаг, который проверяет, имеет ли одна из написанных строк статус «Исключение», и соответствующим образом переименуйте файл