Как пропустить строку заголовка (первую строку) файла в springcloudstream с помощью DSL?

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

Любая помощь приветствуется.

вот как выглядит мой сплиттер и IntegrationFlow:

enter code here
  return IntegrationFlows
            .from("....")
            .split(Files.splitter(true, true)/
            .charset(StandardCharsets.UTF_8)
            .applySequence(true), //emmit sequenceNumber to header
             e -> e.id("fileSplitter")
            );


enter code here
    IntegrationFlow integrationFlow = integrationFlowBuilder
            .<Object, Class<?>>route(Object::getClass, m -> m
                    .channelMapping(FileSplitter.FileMarker.class, "markers.input")
                    .channelMapping(String.class, "lines.input"))
            .get();

person Suresh Naik    schedule 29.08.2017    source источник


Ответы (2)


Если я правильно понял, вы используете одно из наших приложений OOB, источник файла: https://github.com/spring-cloud-stream-app-starters/file/blob/master/spring-cloud-starter-stream-source-file/README.adoc и развертывание с использованием Spring Cloud Dataflow dsl, например stream create file ----file.consumer.mode=lines --file.directory=/tmp/ | sink верно?

Если да, то есть специальный заголовок sequence_number, когда вы читаете файлы в режиме строк. Вы можете добавить промежуточный фильтр, чтобы отбрасывать эти сообщения на основе выражения заголовка.

person Vinicius Carvalho    schedule 29.08.2017
comment
Спасибо за ответ .. Я не использую DataFlow, а использую отдельное приложение процесса источника и приемника .. вот как выглядит сплиттер .from (s -> s.file (новый файл (fileDir)) . )), e -> e.poller(poller)) .split(Files.splitter(true, true) .charset(StandardCharsets.UTF_8) .applySequence(true), //отправляем sequenceNumber в заголовок e -> e.id( fileSplitter)... и - person Suresh Naik; 30.08.2017
comment
Отображение каналов выглядит следующим образом: )) .получить(); - person Suresh Naik; 30.08.2017
comment
Это не читается. Подумайте о том, чтобы внести изменения в свой вопрос с кодом. Однако ответ правильный: вам просто нужно пропустить эту строку ниже по течению, используя фильтр. - person Artem Bilan; 30.08.2017
comment
@ArtemBilan - я обновил свой вопрос с помощью фрагмента кода, который я использую, ответ кажется мне правильным, по этой причине я выдаю sequenceNumber, однако я не могу понять фактическое выражение фильтра, которое я должен использовать. Можете ли вы дать образец фильтра с выражением заголовка, который пропускает сообщение с sequenceNumber=0 ? - person Suresh Naik; 30.08.2017
comment
@ArtemBilan - Спасибо!! это помогло .. sequenceNumber начинается с 1, так как я также испускаю маркер, первая строка в файле получает sequenceNumber = 2. .filter("headers.sequenceNumber != 2") - person Suresh Naik; 30.08.2017

Решение Spring Integration 5.1.5:

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

@Bean
public IntegrationFlow folderFlow() {
    FileSplitter fileSplitter = new FileSplitter();
    fileSplitter.setFirstLineAsHeader("columns");
    return IntegrationFlows.from(sourceDirectory(), configurer -> configurer.poller(Pollers.fixedDelay(1000)))
            .split(fileSplitter)
            .handle(System.out::println)
            .get();
}
person Pavel    schedule 09.10.2019