使用 RemoteFileTemplate

從 Spring Integration 3.0 開始,為 FtpSession 物件提供了一個新的抽象層。此樣板提供了發送、檢索(作為 InputStream)、移除和重新命名檔案的方法。此外,還提供了一個 execute 方法,允許呼叫者在 session 上執行多個操作。在所有情況下,此樣板都會負責可靠地關閉 session。如需更多資訊,請參閱 RemoteFileTemplate 的 Javadoc。有一個 FTP 的子類別:FtpRemoteFileTemplate

版本 4.1 新增了其他方法,包括 getClientInstance(),它提供對底層 FTPClient 的存取,因此您可以存取低階 API。

並非所有 FTP 伺服器都正確實作 STAT <path> 命令。有些伺服器會為不存在的路徑傳回肯定結果。當路徑是檔案且存在時,NLST 命令會可靠地傳回名稱。但是,這不支援檢查空目錄是否存在,因為當路徑是目錄時,NLST 總是傳回空列表。由於樣板不知道路徑是否代表目錄,因此當路徑似乎不存在時(使用 NLST 時),它必須執行額外檢查。這會增加額外負擔,需要向伺服器發出多個請求。從版本 4.1.9 開始,FtpRemoteFileTemplate 提供了 FtpRemoteFileTemplate.ExistsMode 屬性,它具有以下選項

  • STAT:執行 STAT FTP 命令 (FTPClient.getStatus(path)) 以檢查路徑是否存在。這是預設值,並且要求您的 FTP 伺服器正確支援 STAT 命令(帶有路徑)。

  • NLST:執行 NLST FTP 命令 — FTPClient.listName(path)。如果您要測試的路徑是檔案的完整路徑,請使用此選項。它不適用於空目錄。

  • NLST_AND_DIRS:首先執行 NLST 命令,如果它沒有傳回任何檔案,則回退到一種暫時切換工作目錄的技術,方法是使用 FTPClient.changeWorkingDirectory(path)。有關更多資訊,請參閱 FtpSession.exists()

由於我們知道 FileExistsMode.FAIL 案例始終只尋找檔案(而不是目錄),因此我們安全地將 NLST 模式用於 FtpMessageHandlerFtpOutboundGateway 元件。

對於任何其他情況,可以擴展 FtpRemoteFileTemplate 以在覆寫的 exist() 方法中實作自訂邏輯。

從版本 5.0 開始,新的 RemoteFileOperations.invoke(OperationsCallback<F, T> action) 方法可用。此方法允許在同一個、執行緒綁定的 Session 範圍內呼叫多個 RemoteFileOperations 呼叫。當您需要將 RemoteFileTemplate 的多個高階操作作為一個工作單元執行時,這很有用。例如,AbstractRemoteFileOutboundGateway 將其與 mput 命令實作一起使用,在該實作中,我們對提供的目錄中的每個檔案以及其子目錄遞迴地執行 put 操作。有關更多資訊,請參閱 Javadoc