Spring integration 如何使用DSL跳过springcloudstream中文件的头行(第一行)?

Spring integration 如何使用DSL跳过springcloudstream中文件的头行(第一行)?,spring-integration,spring-cloud-stream,spring-dsl,spring-integration-dsl,Spring Integration,Spring Cloud Stream,Spring Dsl,Spring Integration Dsl,我正在使用Spring cloud stream读取一个文件,并使用文件拆分器进行拆分,并使用DSL样式将每一行作为消息发送,正在读取的文件有一个标题行,只是想知道是否有一种简单的方法可以在读取之前/之后跳过标题行 感谢您的帮助 以下是我的拆分器和集成流的外观: enter code here return IntegrationFlows .from("....") .split(Files.splitter(true, true)/

我正在使用Spring cloud stream读取一个文件,并使用文件拆分器进行拆分,并使用DSL样式将每一行作为消息发送,正在读取的文件有一个标题行,只是想知道是否有一种简单的方法可以在读取之前/之后跳过标题行

感谢您的帮助

以下是我的拆分器和集成流的外观:

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();
在此处输入代码
返回积分流
.从(“…”)
.split(Files.splitter)(true,true)/
.charset(标准字符集.UTF_8)
.applySequence(true),//emmit sequenceNumber到标头
e->e.id(“文件拆分器”)
);
在这里输入代码
IntegrationFlow IntegrationFlow=integrationFlowBuilder

.如果我读对了,您正在使用我们的OOB应用程序之一,文件源:并使用Spring Cloud数据流dsl进行部署,例如
stream create file---file.consumer.mode=lines--file.directory=/tmp/| sink
正确吗


如果是这样,当您在lines模式下读取文件时,会有一个名为
sequence\u number
的特殊头。您可以在两者之间添加一个过滤器,根据标题表达式删除这些消息。

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();
}
@Bean
public MessageSource sourceDirectory(){
FileReadingMessageSource messageSource=新建FileReadingMessageSource();
messageSource.setDirectory(新文件(“./data/input”);
返回消息源;
}
@豆子
公共集成流folderFlow(){
filespliter filespliter=新filespliter();
setFirstLineAsHeader(“列”);
返回IntegrationFlows.from(sourceDirectory(),configurer->configurer.poller(Pollers.fixedDelay(1000)))
.split(filespliter)
.handle(System.out::println)
.get();
}

感谢您的回复。。我不使用数据流,但使用独立的源和汇进程应用程序。。下面是拆分器的外观。from(s->s.file(新文件(fileDir)).filter(getFileFilter(fileName)),e->e.poller(poller)).split(Files.splitter(true,true).charset(StandardCharsets.UTF_8).applySequence(true),//emmit sequenceNumber到标题e->e.id(“文件剥离器”)通道映射看起来是这样的:这是不可读的。考虑用代码对你的问题做一个编辑。虽然答案是正确的:你真的只需要用过滤器来跳过这行。@阿尔特比兰-我用我正在使用的代码片段更新了我的问题,答案看起来是正确的,我是EM。出于这个原因,我使用了sequenceNumber,但是我无法计算出我应该使用的实际筛选器表达式,您能给出一个带有标头表达式的示例筛选器,它跳过sequenceNumber=0的消息吗?
.filter(“headers.sequenceNumber!=0”)