FTP/FTPS 适配器
Spring Integration 为 FTP 和 FTPS 的文件传输操作提供了支持。
文件传输协议(FTP)是一种简单的网络协议,允许您在互联网上的两台计算机之间传输文件。FTPS 代表“基于 SSL 的 FTP”。
此依赖项为项目所需:
- Maven
- Gradle
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-ftp</artifactId>
<version>7.0.2</version>
</dependency>
compile "org.springframework.integration:spring-integration-ftp:7.0.2"
在FTP通信中涉及两个参与者:客户端和服务器。使用FTP或FTPS传输文件时,您需要通过客户端发起与运行FTP服务器的远程计算机的连接。建立连接后,客户端可以选择发送或接收文件副本。
Spring Integration 支持通过 FTP 或 FTPS 发送和接收文件,为此提供了三种客户端端点:入站通道适配器、出站通道适配器和出站网关。同时,它还提供了便捷的基于命名空间的配置选项,用于定义这些客户端组件。
要使用 FTP 命名空间,请将以下内容添加到 XML 文件的头部:
xmlns:int-ftp="http://www.springframework.org/schema/integration/ftp"
xsi:schemaLocation="http://www.springframework.org/schema/integration/ftp
https://www.springframework.org/schema/integration/ftp/spring-integration-ftp.xsd"
章节总结
📄️ FTP 会话工厂
Spring Integration 提供了可用于创建 FTP(或 FTPS)会话的工厂。
📄️ 高级配置
DefaultFtpSessionFactory 提供了对底层客户端 API 的抽象(自 Spring Integration 2.0 起,该 API 为 Apache Commons Net)。这使您无需关注 org.apache.commons.net.ftp.FTPClient 的低级配置细节。会话工厂公开了若干常见属性(自版本 4.0 起,现已包含 connectTimeout、defaultTimeout 和 dataTimeout)。但有时您需要访问更低级别的 FTPClient 配置以实现更高级的配置(例如设置主动模式的端口范围)。为此,AbstractFtpSessionFactory(所有 FTP 会话工厂的基类)以两个后处理方法的形式提供了钩子,如下列清单所示:
📄️ 委托会话工厂
版本 4.2 引入了 DelegatingSessionFactory,它允许在运行时选择实际的会话工厂。在调用 FTP 端点之前,请先在工厂上调用 setThreadKey() 以将密钥与当前线程关联。然后,该密钥将用于查找要使用的实际会话工厂。使用后,可以通过调用 clearThreadKey() 来清除密钥。
📄️ FTP 入站通道适配器
FTP入站通道适配器是一种特殊的监听器,它连接到FTP服务器并监听远程目录事件(例如新文件创建),随后触发文件传输。以下示例展示了如何配置入站通道适配器:
📄️ FTP 流式入站通道适配器
版本 4.3 引入了流式入站通道适配器。该适配器生成有效负载类型为 InputStream 的消息,允许在不写入本地文件系统的情况下获取文件。由于会话保持打开状态,消费应用程序需在文件消费完毕后负责关闭会话。会话通过 closeableResource 头部(IntegrationMessageHeaderAccessor.CLOSEABLE\_RESOURCE)提供。标准框架组件(如 FileSplitter 和 StreamTransformer)会自动关闭会话。有关这些组件的更多信息,请参阅文件拆分器和流转换器。以下示例展示了如何配置 inbound-streaming-channel-adapter:
📄️ 入站通道适配器:轮询多个服务器和目录
从 5.0.7 版本开始,引入了 RotatingServerAdvice;当将其配置为轮询器通知时,入站适配器可以轮询多个服务器和目录。请按常规方式配置该通知并将其添加到轮询器的通知链中。系统会使用 DelegatingSessionFactory 来选择服务器,更多信息请参阅委托会话工厂。该通知的配置包含一个 RotationPolicy.KeyDirectory 对象列表。
📄️ 入站通道适配器:控制远程文件获取
请参阅 SFTP:控制远程文件获取,了解完全相同的通用功能。
📄️ FTP 出站通道适配器
FTP出站通道适配器依赖于一个MessageHandler实现,该实现连接到FTP服务器,并为它在传入消息的有效负载中接收到的每个文件启动FTP传输。它还支持文件的多种表示形式,因此您不仅限于java.io.File类型的有效负载。FTP出站通道适配器支持以下有效负载类型:
📄️ FTP 出站网关
FTP出站网关提供了一组有限的命令,用于与远程FTP或FTPS服务器进行交互。支持的命令包括:
📄️ FTP 会话缓存
在 3.0 之前的版本中,会话默认会自动缓存。虽然可以通过 cache-sessions 属性来禁用自动缓存,但该方案并未提供配置其他会话缓存属性的方法。例如,无法限制创建的会话数量。为了支持这一需求及其他配置选项,我们添加了 CachingSessionFactory。它提供了 sessionCacheSize 和 sessionWaitTimeout 属性。sessionCacheSize 属性控制工厂在其缓存中维护的活动会话数量(默认无限制)。如果已达到 sessionCacheSize 阈值,任何获取另一个会话的尝试都将被阻塞,直到缓存中的某个会话变为可用,或者会话等待时间超时(默认等待时间为 Integer.MAX\_VALUE)。sessionWaitTimeout 属性用于配置该值。
📄️ 使用 RemoteFileTemplate
自 Spring Integration 3.0 起,框架在 FtpSession 对象之上提供了一个新的抽象层。该模板提供了发送、检索(作为 InputStream)、删除和重命名文件的方法。此外,还提供了一个 execute 方法,允许调用者在会话上执行多个操作。在所有情况下,模板都会确保可靠地关闭会话。更多信息请参阅 RemoteFileTemplate 的 Javadoc。针对 FTP 存在一个子类:FtpRemoteFileTemplate。
📄️ 使用 MessageSessionCallback
从 Spring Integration 4.2 开始,你可以将 MessageSessionCallback\<F, T> 实现与 \<int-ftp:outbound-gateway/>(Java 中的 FtpOutboundGateway)结合使用,以便在 Session\<FTPFile> 上结合请求消息上下文执行任意操作。它可用于任何非标准或底层的 FTP 操作,并允许访问集成流定义和函数式接口(Lambda)实现注入,如下例所示:
📄️ Apache Mina FTP 服务器事件
ApacheMinaFtplet 自 5.2 版本起加入,用于监听特定的 Apache Mina FTP 服务器事件,并将这些事件作为 ApplicationEvents 发布。这些事件可以被任何 ApplicationListener bean、@EventListener bean 方法或 Event Inbound Channel Adapter 接收。
📄️ 远程文件信息
从 5.2 版本开始,FtpStreamingMessageSource(FTP 流式入站通道适配器)、FtpInboundFileSynchronizingMessageSource(FTP 入站通道适配器)以及 FtpOutboundGateway(FTP 出站网关)的 \"read\" 命令,会在生成的消息中提供额外的头部信息,这些信息包含了关于远程文件的信息: