Spring integration Spring集成DSL从主类运行Sftp出站流

Spring integration Spring集成DSL从主类运行Sftp出站流,spring-integration,Spring Integration,我创建了两个集成流,一个是文件入站流,用于查找我的本地目录,另一个是Sftp出站流,用于将这些文件从本地目录发送到远程目录。我从主类运行这些流,即不使用Junit。那个么我该如何将消息从文件入站流发送到Sftp出站流呢。在Junit测试方法中,我可以使用send()方法进行文件传输,但在本例中无法发送文件。既然我不能继续下去,有谁能帮我吗 这是我的文件入站流 @Bean public IntegrationFlow fileReadingFlow() { return

我创建了两个集成流,一个是文件入站流,用于查找我的本地目录,另一个是Sftp出站流,用于将这些文件从本地目录发送到远程目录。我从主类运行这些流,即不使用Junit。那个么我该如何将消息从文件入站流发送到Sftp出站流呢。在Junit测试方法中,我可以使用send()方法进行文件传输,但在本例中无法发送文件。既然我不能继续下去,有谁能帮我吗

这是我的文件入站流

@Bean
public IntegrationFlow fileReadingFlow() {          
    return IntegrationFlows
            .from(fileMessageSource(),
                    new Consumer<SourcePollingChannelAdapterSpec>() {

                        @Override
                        public void accept(SourcePollingChannelAdapterSpec e) {
                            e.autoStartup(true).poller(Pollers.fixedRate(6000)
                                            .maxMessagesPerPoll(1));
                        }
                    }).transform(Transformers.fileToByteArray())
            .channel(MessageChannels.queue("fileReadingResultChannel"))
            .get();
}

@Bean
public MessageSource<File> fileMessageSource() {

    FileReadingMessageSource source = new FileReadingMessageSource();
    source.setDirectory(new File(localDir));    
    source.setAutoCreateDirectory(true);        
    return source;
}
正如Gary所建议的,我的新流程是

@Bean
public IntegrationFlow fileReadingFlow() {          
    return IntegrationFlows
            .from("fileReadingResultChannel")
            .transform(Transformers.fileToByteArray())
            .handle(Sftp.outboundAdapter(this.sftpSessionFactory)
                    .remoteFileSeparator("\\")
                    .useTemporaryFileName(false)
                    .remoteDirectory(remDir))
            //.channel(this.fileReadingResultChannel)
                    .channel(MessageChannels.direct("fileReadingResultChannel"))
            .get();
}
错误日志是


org.springframework.beans.factory.BeanCreationException:创建名为“fileReadingFlow”的bean时出错,该bean在类src.SftpOutBoundDsl中定义:通过工厂方法实例化bean失败;嵌套异常为org.springframework.beans.Bean实例化异常:未能实例化[org.springframework.integration.dsl.IntegrationFlow]:工厂方法“fileReadingFlow”引发异常;嵌套的异常是org.springframework.beans.factory.BeanCreationException:currentComponent(org.springframework.integration.file.remote.handler)。FileTransferringMessageHandler@629a)是单向“MessageHandler”,不适合配置“outputChannel”。这是集成流程的结束。
位于org.springframework.beans.factory.support.ConstructorResolver.InstanceUsingFactoryMethod(ConstructorResolver.java:602)
位于org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.InstanceUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1111)
位于org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1006)
位于org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:504)
位于org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
位于org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302)
位于org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
位于org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298)
位于org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
位于org.springframework.beans.factory.support.DefaultListableBeanFactory.PreInstanceSingleton(DefaultListableBeanFactory.java:762)
位于org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760)
位于org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)
位于org.springframework.boot.SpringApplication.refresh(SpringApplication.java:686)
位于org.springframework.boot.SpringApplication.run(SpringApplication.java:320)
位于org.springframework.boot.SpringApplication.run(SpringApplication.java:957)
位于org.springframework.boot.SpringApplication.run(SpringApplication.java:946)
位于src.mainstfpoutbounddsl.main(mainstfpoutbounddsl.java:14)

将入站适配器频道更改为使用

MessageChannels.direct("fileReadingResultChannel")
将这两个流连接在一起

return IntegrationFlows
        .from("fileReadingResultChannel")
        .handle(...
编辑

.channel(MessageChannels.direct(“fileReadingResultChannel”))

出站通道适配器不产生任何结果,因此您不能使用通道跟踪它

错误信息对我来说似乎很清楚

。。。FileTransferringMessageHandler。。。是单向“MessageHandler”,不适合配置“outputChannel”。这是集成流程的结束

…但如果您认为需要澄清,请告知我们


如果您希望流在文件传输后继续,请在转换器后添加一个
publishSubscribeChannel
,如果文件传输成功,消息将转到另一个订阅者(流)。

您好,正如您所建议的,我已对流进行了更改,将两个流合并为一个流,但是我想知道在哪里提到本地目录路径。当我运行代码时,它也会出现异常。所以,你能提供一些关于这方面的建议吗。我已经在我的原始帖子中发布了新的流和错误日志。实际上,我希望,我的入站文件适配器应该查找我的本地目录文件,并将文件发送到Sftp out bound adapter,后者负责将所有这些文件从本地目录复制到远程目录。这就是为什么我创建了两个独立的流,在Junit测试方法中运行得很好,但在主类中我很难做到这一点。所以,你能提供更多关于这方面的建议吗?你还需要什么帮助?我解释了怎么做。只是为了确认一下,我可以像我之前做的那样做这两个单独的流吗?是的,第二个订户可以是一个单独的流。
return IntegrationFlows
        .from("fileReadingResultChannel")
        .handle(...