2014-09-03 36 views
2

我使用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

回答

1

你可能會更好使用MGET和出站網關來檢索文件,而不是使用入站適配器,正如你說的,是兩個階段 - 同步和發送本地目錄中的文件的消息(除非您使用持久性文件列表過濾器,在這種情況下,您只會看到「新」文件)。

+0

嗨加里,非常感謝。這是有道理的,我會將我的代碼更改爲使用SFTP出站網關的MGET。問候,弗蘭克 – Frank 2014-09-04 08:05:47