FlatFileItemWriter записывает в новый (несуществующий) файл для каждого JobExecution

В настоящее время я работаю над Spring Batch CSV Export. Используется устройство чтения, записи и процессора на основе фрагментов. Чтение и обработка работают безупречно, но FlatFileItemWriter всегда перезаписывает выходной файл CSV. Я хочу, чтобы задание проверяло, существует ли файл, если он существует, увеличивайте имя файла и записывайте в новый файл.

Вот мой текущий код: My Helper class, который проверяет, существует ли файл, и возвращает новую строку для использования Writer.

import java.io.File;

import org.springframework.stereotype.Component;

@Component
public class OrderFileManager {

    private final String orderDesc = "order";
    private final String fileEnding = ".csv";

    public String getEmptyOrderNameString() {

        int fileNumber = 1;
        String answer = orderDesc + fileNumber + fileEnding;

        while (new File(answer).exists()) {
            fileNumber = fileNumber + 1;
            answer = orderDesc + fileNumber + fileEnding;
        }
        return answer;
    }
}

Мой ItemWriter:

    @Bean
    public FlatFileItemWriter<UltravisionOrder> writer(String fileName) {
        FlatFileItemWriter<UltravisionOrder> writer = new FlatFileItemWriter<UltravisionOrder>();  
        writer.setResource(new FileSystemResource(fileName));
        DelimitedLineAggregator<UltravisionOrder> delimitedLineAggregator = new DelimitedLineAggregator<UltravisionOrder>();
        delimitedLineAggregator.setDelimiter(";");
        BeanWrapperFieldExtractor<UltravisionOrder> fieldExtractor = new BeanWrapperFieldExtractor<UltravisionOrder>();
        fieldExtractor.setNames(new String[] { "col1", "col2", "col3", ... });
        delimitedLineAggregator.setFieldExtractor(fieldExtractor);
        writer.setLineAggregator(delimitedLineAggregator);
        return writer;
    }

Каждый раз, когда задание выполняется, FileWriter записывает в один и тот же выходной файл. OrderFileManager автоматически подключается к Job. И писатель получает OrderFileManager. getEmptyOrderNameString() в качестве параметра.

1 ответ

Решение

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

Что вы можете сделать, так это ограничить область действия сценария и настроить его, вызвав метод, который генерирует имя файла с помощью выражения SpEL:

@Bean
@StepScope
public FlatFileItemWriter<UltravisionOrder> itemWriter(@Value("#{orderFileManager.getEmptyOrderNameString()}") String fileName) {
    // ...
}
Другие вопросы по тегам