2014-09-10 60 views
2

我想利用Spring集成啓動消息文件出現在遠程位置,而不實際傳輸它們。我所需要的只是生成一個消息,例如標題值指示文件和文件名的路徑。Spring集成FTP - 無需傳輸的輪詢?

完成此操作的最佳方法是什麼?我已經嘗試使用服務激活器將FTP入站通道適配器串在一起以編寫我需要的標頭值,但是這會導致文件被傳輸到本地臨時目錄,並且在服務激活器看到它時,一個java.io.File引用本地文件,遠程路徑信息不見了。在發生本地傳輸之前可以轉換消息嗎?

+0

我也嘗試過使用變壓器而不是服務激活器來查看消息中是否會出現一些差異。不,它仍然攜帶一個指向本地文件的java.io.File作爲有效內容,而不包含標識原始遠程位置的標頭。 – Jeff 2014-09-11 13:14:23

回答

2

我們有類似的問題,我們用過濾器解決了它。在入站通道適配器上,您可以設置自定義過濾器實現。因此,在輪詢之前,您的過濾器將被調用,您將獲得有關文件的所有信息,例如,您可以從中決定是否下載該文件;

<int-sftp:inbound-channel-adapter id="test" 
            session-factory="sftpSessionFactory" 
            channel="testChannel" 
            remote-directory="${sftp.remote.dir}" 
            local-directory="${sftp.local.dir}" 
            filter="customFilter" 
            delete-remote-files="false"> 
    <int:poller trigger="pollingTrigger" max-messages-per-poll="${sftp.max.msg}"/> 
</int-sftp:inbound-channel-adapter> 

<beans:bean id="customFilter" class="your.class.location.SftpRemoteFilter"/> 

過濾器類只是FileListFilter接口的實現。這是虛擬過濾器的實現。

public class SftpRemoteFilter implements FileListFilter<LsEntry> { 

    private static final Logger log = LoggerFactory.getLogger(SftpRemoteFilter.class); 

    @Override 
    public final List<LsEntry> filterFiles(LsEntry[] files) { 
     log.info("Here is files."); 
     //Do something smart 
     return Collections.emptyList(); 
    } 
} 

但是,如果你想這樣做,因爲你描述的,我認爲這是可能通過設置有效載荷頭,然後使用相同的標題,當你正在使用的有效載荷做到這一點,但在這種情況下,你應該使用Message<File>改爲將文件存儲在您的服務激活方法中。

+1

這種基本的方法有效。請注意,filterFiles必須返回一個空列表,而不是像您的示例代碼中那樣錯誤。在我的情況下,我能夠調用MessageTemplate在過濾器中的不同通道上發送新消息,然後始終返回一個空列表以避免在原始通道上進行任何文件下載或消息生成。這感覺有點像我們正在反對框架的設計,但我願意接受它,因爲我沒有看到任何不涉及編寫新型通道適配器的替代方案。 – Jeff 2014-09-22 14:04:02

+0

對不起。現在它被糾正了。 – 2014-09-22 14:22:32