使用 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
模式用於 FtpMessageHandler
和 FtpOutboundGateway
元件。
對於任何其他情況,可以擴展 FtpRemoteFileTemplate
以在覆寫的 exist()
方法中實作自訂邏輯。
從版本 5.0 開始,新的 RemoteFileOperations.invoke(OperationsCallback<F, T> action)
方法可用。此方法允許在同一個、執行緒綁定的 Session
範圍內呼叫多個 RemoteFileOperations
呼叫。當您需要將 RemoteFileTemplate
的多個高階操作作為一個工作單元執行時,這很有用。例如,AbstractRemoteFileOutboundGateway
將其與 mput
命令實作一起使用,在該實作中,我們對提供的目錄中的每個檔案以及其子目錄遞迴地執行 put
操作。有關更多資訊,請參閱 Javadoc。