FTP/FTPS 适配器
Spring Integration 提供了对使用 FTP 和 FTPS 进行文件传输操作的支持。
文件传输协议 (FTP) 是一种简单的网络协议,它允许你在互联网上的两台计算机之间传输文件。FTPS 代表“通过 SSL 的 FTP”。
你需要将这个依赖项添加到你的项目中:
- Maven
- Gradle
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-ftp</artifactId>
<version>6.4.2</version>
</dependency>
compile "org.springframework.integration:spring-integration-ftp:6.4.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 的抽象,该 API(自 Spring Integration 2.0 起)是 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,会自动关闭会话。有关这些组件的更多信息,请参阅文件拆分器和流转换器。以下示例展示了如何配置入站流通道适配器:
📄️ 入站通道适配器:轮询多个服务器和目录
从 5.0.7 版本开始,提供了 RotatingServerAdvice;当配置为轮询器建议时,入站适配器可以轮询多个服务器和目录。按照常规方式配置该建议并将其添加到轮询器的建议链中。使用 DelegatingSessionFactory 来选择服务器,详情请参阅委托会话工厂。建议的配置由一系列 RotationPolicy.KeyDirectory 对象组成。
📄️ 入站通道适配器:控制远程文件获取
在配置入站通道适配器时,您应该考虑两个属性。max-messages-per-poll,如同所有轮询器一样,可用于限制每次轮询发出的消息数量(如果有超过配置值的消息准备好)。max-fetch-size(自 5.0 版本起)可以限制从远程服务器一次检索的文件数量。
📄️ FTP 外发通道适配器
FTP 外发通道适配器依赖于一个 MessageHandler 实现,该实现会连接到 FTP 服务器,并为接收到的每个文件发起一次 FTP 传输,这些文件位于传入消息的有效负载中。它还支持几种文件表示形式,因此你不仅限于使用 java.io.File 类型的有效负载。FTP 外发通道适配器支持以下有效负载:
📄️ FTP 外发网关
FTP outbound 网关提供了一组有限的命令来与远程 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 上的任何操作,并带有 requestMessage 上下文。它可以用于任何非标准或低级别的 FTP 操作,并允许从集成流定义和功能接口(Lambda)实现注入访问,如下例所示:
📄️ Apache Mina FTP 服务器事件
在版本 5.2 中添加的 ApacheMinaFtplet,会监听特定的 Apache Mina FTP 服务器事件,并将它们发布为 ApplicationEvent,这些事件可以由任何 ApplicationListener bean、@EventListener bean 方法或 Event Inbound Channel Adapter 接收。
📄️ 远程文件信息
从 5.2 版本开始,FtpStreamingMessageSource(FTP 流式传输入站通道适配器)、FtpInboundFileSynchronizingMessageSource(FTP 入站通道适配器)和 FtpOutboundGateway(FTP 出站网关)的 \"read\" 命令在生成的消息中提供了额外的标头,以提供有关远程文件的信息: