Чтение файла построчно с использованием Spring интеграции dsl

Я пытаюсь прочитать файл, но мне нужно разделить его построчно, используя Spring Integration DSL. Что мне нужно добавить в потоки интеграции, чтобы он заработал

Источник сообщения

 @Bean
    public MessageSource<File> sourceDirectory() {
        FileReadingMessageSource messageSource = new FileReadingMessageSource();
        messageSource.setDirectory(new File(fileSource));
        return messageSource;
    }

Фильтр

@Bean
    public GenericSelector<File> onlyCSVs() {
        return (file) -> file.getName().endsWith(".csv");
    }

Преобразователь файлов

 @Bean
    public FileToStringTransformer fileToStringTransformer() {
        return new FileToStringTransformer();
    }

Интеграционный поток

@Bean
    public StandardIntegrationFlow integrationFlow() {
        return IntegrationFlows
                .from(sourceDirectory(), configurer -> configurer.poller(Pollers.fixedDelay(10000)))
                .channel("fileInputChannel")

                .filter(onlyCSVs())
                .transform(fileToStringTransformer())
                .handle(m -> System.out.println((String.valueOf(Math.random()) + m.getPayload())))
                .get();
    }

person Ilya Ostapchenko    schedule 22.08.2019    source источник


Ответы (1)


после вашего преобразователя filetoString я бы добавил еще один настраиваемый преобразователь, который берет строку и создает такой массив.

String.split("[\\r\\n]+")

он уже удаляет пустые строки, затем после этого я бы добавил .split () в поток, чтобы он создавал сообщение для каждой строки, .split () уже работает с итераторами, на случай, если просто преобразуйте массив в список, и вы готово.

это что-то вроде:

@Bean
public StandardIntegrationFlow integrationFlow() {
    return IntegrationFlows
            .from(sourceDirectory(), configurer -> configurer.poller(Pollers.fixedDelay(10000)))
            .channel("fileInputChannel")

            .filter(onlyCSVs())
            .transform(fileToStringTransformer())
            .transform(GenericMessage.class, message -> message.getPayload().split("[\\r\\n]+"))
            .split()
            .handle(m -> System.out.println((String.valueOf(Math.random()) + m.getPayload())))
            .get();
}
person Joaquin Santana    schedule 23.08.2019