Spring integration Spring集成DSL在Java1.7中创建Sftp出站适配器
我已经在spring DSL中创建了一个Sftp出站流,我还在Sftp出站流之上创建了一个文件入站流,用于从本地目录查找文件,并将其发送到消息通道,该通道负责将文件复制到远程目录,但当我运行代码时,没有文件被复制到远程目录目录所以我被困在这一点上,请任何人提供任何指向它的指针,因为我无法继续 这是我的会话工厂Spring integration Spring集成DSL在Java1.7中创建Sftp出站适配器,spring-integration,Spring Integration,我已经在spring DSL中创建了一个Sftp出站流,我还在Sftp出站流之上创建了一个文件入站流,用于从本地目录查找文件,并将其发送到消息通道,该通道负责将文件复制到远程目录,但当我运行代码时,没有文件被复制到远程目录目录所以我被困在这一点上,请任何人提供任何指向它的指针,因为我无法继续 这是我的会话工厂 @Autowired private DefaultSftpSessionFactory sftpSessionFactory; @Bean public
@Autowired
private DefaultSftpSessionFactory sftpSessionFactory;
@Bean
public DefaultSftpSessionFactory sftpSessionFactory() {
DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory(
true);
factory.setHost("111.11.12.143");
factory.setPort(22);
factory.setUser("sftp");
factory.setPassword("*******");
return factory;
}
这是我的sftp出站流程
@Bean
public IntegrationFlow sftpOutboundFlow() {
return IntegrationFlows
.from("toSftpChannel")
.handle(Sftp.outboundAdapter(this.sftpSessionFactory)
.remoteFileSeparator("\\")
.useTemporaryFileName(false)
.remoteDirectory(remDir)).get();
}
这是我的文件入站流
@Bean
public IntegrationFlow fileReadingFlow() {
return IntegrationFlows
.from(fileMessageSource(),
new Consumer<SourcePollingChannelAdapterSpec>() {
@Override
public void accept(SourcePollingChannelAdapterSpec e) {
e.poller(Pollers.fixedRate(6));
}
})
.transform(Transformers.fileToByteArray())
.channel(MessageChannels.queue("fileReadingResultChannel"))
.get();
}
@Bean
公共集成流文件ReadingFlow(){
返回积分流
.from(fileMessageSource(),
新消费者(){
@凌驾
公共无效接受(SourcePollingChannelAdapterSpec e){
e、 轮询器(固定轮询器(6));
}
})
.transform(Transformers.fileToByteArray())
.channel(MessageChannels.queue(“fileReadingResultChannel”))
.get();
}
这是MessageSource方法
@Bean
public MessageSource<File> fileMessageSource() {
FileReadingMessageSource source = new FileReadingMessageSource();
source.setDirectory(new File(localDir));
source.setAutoCreateDirectory(true);
System.out.println("enter fileMessageSource....."+ source.receive());
return source;
}
@Bean
public MessageSource fileMessageSource(){
FileReadingMessageSource=新建FileReadingMessageSource();
setDirectory(新文件(localDir));
source.setAutoCreateDirectory(true);
System.out.println(“输入fileMessageSource…”+source.receive());
返回源;
}
这是我的Junit测试方法
@Autowired
private DefaultSftpSessionFactory sftpSessionFactory;
@Autowired
@Qualifier("toSftpChannel")
private MessageChannel toSftpChannel;
@Autowired
@Qualifier("fileReadingResultChannel")
private PollableChannel fileReadingResultChannel;
@Test
public void testSftpOutboundFlow() {
Message<?> message = ((PollableChannel) fileReadingResultChannel)
.receive(600);
System.out.println("message....."+message);
this.toSftpChannel.send(message);
}
@Autowired
私有DefaultSftpSessionFactory sftpSessionFactory;
@自动连线
@限定符(“toSftpChannel”)
私有消息通道到ftpcchannel;
@自动连线
@限定符(“fileReadingResultChannel”)
专用可轮询通道fileReadingResultChannel;
@试验
public void testSftpOutboundFlow(){
消息消息=((PollableChannel)fileReadingResultChannel)
.接收(600);
System.out.println(“消息…”+消息);
此.toSftpChannel.send(消息);
}
系统.out.println(“输入fileMessageSource…..”+source.receive())代码>在fileMessageSource()
@Bean
中不好,因为您在那里执行source.receive()
。这样做不是SOUT
的责任
从另一方面来说,如果你能和我们分享一些关于这件事的线索会更好
还有一点:您是否在控制台中看到System.out.println(“message…”+message)的结果
?系统.out.println(“输入fileMessageSource…”+source.receive())代码>在fileMessageSource()
@Bean
中不好,因为您在那里执行source.receive()
。这样做不是SOUT
的责任
从另一方面来说,如果你能和我们分享一些关于这件事的线索会更好
还有一点:您是否在控制台中看到System.out.println(“message…”+message)的结果代码>?当我的本地目录中只有一个文件时,“消息”为空,但如果有多个文件,则仅拾取第二个文件并将其复制到远程目录,然后停止处理。请查找相同的堆栈跟踪输入fileMessageSource.GenericMessage[payload=D:\local_copy\SFTP.TXT,headers={timestamp=1436937421367,id=37994faa-236c-b64f-6390-f496bebb6a19}]消息..空。这次我只保留了一个文件,消息是空的。嗨,Artem,我已经删除了System.out.println(“enter fileMessageSource…”+source.receive());来自fileMessageSource()方法。现在,第一个文件正在远程计算机中复制,但其他文件未复制。我认为民意测验仪工作不正常,但不确定。你能给点提示吗?那只是因为你的测试用例只关心第一个文件和出口。谢谢Artem,我能在我的测试方法的while循环中处理这个问题吗?像这样…@Test public void testSftpOutboundFlow(){while(!fileReadingResultChannel.equals(null)){Message Message=this.fileReadingResultChannel.receive(60000);this.toSftpChannel.send(Message);}}是的,您可以。或者只需手动将filereadingsultchannel.receive()
作为您要测试的文件。当我的本地目录中只有一个文件时,“消息”为空,但如果有多个文件,则仅拾取第二个文件并通过远程目录复制它,然后停止处理。请查找相同的堆栈跟踪输入fileMessageSource.GenericMessage[payload=D:\local_copy\SFTP.TXT,headers={timestamp=1436937421367,id=37994faa-236c-b64f-6390-f496bebb6a19}]消息..空。这次我只保留了一个文件,消息是空的。嗨,Artem,我已经删除了System.out.println(“enter fileMessageSource…”+source.receive());来自fileMessageSource()方法。现在,第一个文件正在远程计算机中复制,但其他文件未复制。我认为民意测验仪工作不正常,但不确定。你能给点提示吗?那只是因为你的测试用例只关心第一个文件和出口。谢谢Artem,我能在我的测试方法的while循环中处理这个问题吗?像这样…@Test public void testSftpOutboundFlow(){while(!fileReadingResultChannel.equals(null)){Message Message=this.fileReadingResultChannel.receive(60000);this.toSftpChannel.send(Message);}}是的,您可以。或者只需手动生成您想要测试的文件的数量。