我使用Spring Integration中的inbound-channel-adapter
从远程服务器检索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=......]
因此,即使文件没有从远程服务器进行物理检索,channel.receive()
方法仍会收到带有该文件作为有效负载的消息。
这让我感到困惑,因为我无法从消息中确定该文件是否已在本地文件系统上或刚从远程服务器检索到。
我尝试使用自定义org.springframework.messaging.support.ChannelInterceptorAdapter
,FileFilter
,ServiceActivator
,但问题仍然存在。
我的应用程序将处理大量数据,因此不能选择将收到的文件发送到远程服务器上的所需目录。而且只是尝试将文件远程移动到本地接收的每条消息,这不是一个选项,因为它会使日志文件混乱,除非无法移动文件。这种方式在出现真正的错误情况时,将无法检测到问题。
一个解决方案可能是copyFileToLocalDirectory
方法org.springframework.integration.file.remote.synchronizer.AbstractInboundFileSynchronizer
中的一个钩子。
如果应删除远程文件并且仅针对实际从远程服务器传输的文件调用该循环,则执行检查。我试图覆盖此方法并添加我的移动行为没有成功,因为Spring已经实例化了类
这将处理这个。
那么实现这一目标的最佳方法是什么?我知道这个问题可能位于我的键盘和我的椅子之间,但我已经没有选择了,我们非常感谢任何帮助。
非常感谢,
谢
答案 0 :(得分:1)
你可能最好使用MGET和出站网关来检索文件,而不是使用入站适配器,正如你所说的,它是两阶段 - 同步,并为文件发出消息。本地目录(除非你使用持久文件列表过滤器,在这种情况下你只会看到“新”文件)。