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