Spring集成sftp移动远程文件问题

问题描述:

我使用Spring Integration的inbound-channel-adapter从远程服务器通过sftp检索文件。一切正常。 但我有一个额外的要求:在本地接收到文件后,该文件需要移动到远程服务器上的“发送”目录。Spring集成sftp移动远程文件问题

“SFTP出站网关”有适当的方法,即移动动作,但我的问题是何时调用它。

情况:远程服务器上的10个文件,本地服务器上的0 当我启动我的应用程序时,它将从远程服务器接收所有10个文件,并将它们写入我的本地文件系统。完善。

情况:远程服务器上有1个文件,本地服务器上有10个文件 在这种情况下,接收到远程文件,但是对于本地文件系统上的每个文件,也会调用QueueChannel的接收方法。 实施例记录来自一个文件:(file1.zip)

18:12:52.118 [task-scheduler-1] INFO o.s.i.file.FileReadingMessageSource - Created message: [[Payload File content=C:\Downloads\sftpTest\file1.zip][Headers=...] 
18:12:52.119 [task-scheduler-1] DEBUG o.s.i.e.SourcePollingChannelAdapter - Poll resulted in Message: [Payload File content=C:\Downloads\sftpTest\file1.zip][Headers=...] 
18:12:52.119 [task-scheduler-1] DEBUG o.s.integration.channel.QueueChannel - preSend on channel 'fromChannel', message: [Payload File content=C:\Downloads\sftpTest\file1.zip][...] 
18:12:52.119 [task-scheduler-1] DEBUG o.s.integration.channel.QueueChannel - postSend (sent=true) on channel 'fromChannel', message: [Payload File content=C:\Downloads\sftpTest\file1.zip][Headers=...] 
18:12:52.119 [main] DEBUG o.s.integration.channel.QueueChannel - postReceive on channel 'fromChannel', message: [Payload File content=C:\Downloads\sftpTest\file1.zip][Headers=......] 

所以,即使当它不physicaly从远程服务器retreived该文件时,channel.receive()方法仍然会收到的消息与该文件作为有效载荷。 这让我感到困惑,因为我无法从消息中确定文件是否已经在本地文件系统上,或者刚刚从远程服务器中检索。 我尝试使用自定义org.springframework.messaging.support.ChannelInterceptorAdapter,FileFilter,ServiceActivator,但问题仍然存在。

我的应用程序将处理高容量,因此将接收到的文件发送到远程服务器上所需的目录不是一个选项。另外,简单地尝试将文件移动到本地接收的每条消息,都不是一种选择,因为它会使日志文件混乱,但无法移动文件。这种情况下,如果出现真实的错误情况,则不会检测到问题。

一种解决方案可能是org.springframework.integration.file.remote.synchronizer.AbstractInboundFileSynchronizercopyFileToLocalDirectory方法中的挂钩。 如果应该删除远程文件并且仅针对实际从远程服务器传输的文件调用该循环,则执行检查。我尝试重写此方法并添加我的移动行为并未成功,因为Spring已经实例化了将处理此类的类 。

那么实现这一目标的最佳方法是什么?我知道问题可能会出现在我的键盘和我的椅子之间,但我已经用完了选项,任何帮助都非常感谢。

非常感谢,

弗兰克

+0

分享你的配置,请 – 2014-09-03 17:34:22

你可能会更好使用MGET和出站网关来检索文件,而不是使用入站适配器,正如你说的,是两个阶段 - 同步和发送本地目录中的文件的消息(除非您使用持久性文件列表过滤器,在这种情况下,您只会看到“新”文件)。

+0

嗨加里,非常感谢。这是有道理的,我会将我的代码更改为使用SFTP出站网关的MGET。问候,弗兰克 – Frank 2014-09-04 08:05:47