使用 RemoteFileTemplate
從 Spring Integration 3.0 開始,在 FtpSession 物件之上提供了一個新的抽象。該模板提供了傳送、檢索(作為 InputStream)、刪除和重新命名檔案的方法。此外,還提供了 execute 方法,允許呼叫者在會話上執行多個操作。在所有情況下,模板都負責可靠地關閉會話。有關更多資訊,請參閱 RemoteFileTemplate 的 Javadoc。有一個 FTP 的子類:FtpRemoteFileTemplate。
版本 4.1 添加了其他方法,包括 getClientInstance(),它提供對底層 FTPClient 的訪問,從而讓您訪問低階 API。
並非所有 FTP 伺服器都正確實現了 STAT <path> 命令。有些伺服器對不存在的路徑返回正面結果。當路徑是檔案且存在時,NLST 命令可靠地返回名稱。但是,這不支援檢查空目錄是否存在,因為當路徑是目錄時,NLST 始終返回空列表。由於模板不知道路徑是否表示目錄,因此當路徑似乎不存在時(使用 NLST 時),它必須執行額外的檢查。這增加了開銷,需要向伺服器發出多個請求。從版本 4.1.9 開始,FtpRemoteFileTemplate 提供了 FtpRemoteFileTemplate.ExistsMode 屬性,它具有以下選項:
-
STAT:執行STATFTP 命令(FTPClient.getStatus(path))來檢查路徑是否存在。這是預設設定,要求您的 FTP 伺服器正確支援STAT命令(帶路徑)。 -
NLST:執行NLSTFTP 命令 —FTPClient.listName(path)。如果您正在測試完整檔案路徑,請使用此選項。它不適用於空目錄。 -
NLST_AND_DIRS:首先執行NLST命令,如果它不返回任何檔案,則回退到透過使用FTPClient.changeWorkingDirectory(path)臨時切換工作目錄的技術。有關更多資訊,請參閱FtpSession.exists()。
由於我們知道 FileExistsMode.FAIL 情況始終只查詢檔案(而不是目錄),因此我們對 FtpMessageHandler 和 FtpOutboundGateway 元件安全地使用 NLST 模式。
對於任何其他情況,可以擴充套件 FtpRemoteFileTemplate 以在重寫的 exist() 方法中實現自定義邏輯。
從版本 5.0 開始,新的 RemoteFileOperations.invoke(OperationsCallback<F, T> action) 方法可用。此方法允許在同一執行緒繫結的 Session 範圍內呼叫多個 RemoteFileOperations。當您需要將 RemoteFileTemplate 的多個高階操作作為一個工作單元執行時,這非常有用。例如,AbstractRemoteFileOutboundGateway 將其與 mput 命令實現一起使用,在該實現中,我們對提供的目錄中的每個檔案及其子目錄遞迴執行 put 操作。有關更多資訊,請參閱 Javadoc。
從版本 6.5 開始,AbstractRemoteFileOutboundGateway 支援透過 SpEL 表示式在執行時動態解析 FileExistsMode。這允許您根據訊息內容或其他條件確定檔案已經存在時要採取的操作。
要使用此功能,請在閘道器上配置 fileExistsModeExpression 屬性。表示式可以評估為
-
FileExistsMode列舉值(例如,FileExistsMode.REPLACE) -
FileExistsMode的字串表示(不區分大小寫,例如,“REPLACE”,“append”)
如果表示式返回 null,將使用閘道器上配置的預設 fileExistsMode。
有關更多資訊,請參閱 Javadoc。
|
當使用 |