|
如需使用最新稳定版本,请使用 Spring Integration 7.0.4! |
使用 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。