SFTP 适配器
Spring Integration 提供了通过 SFTP 进行文件传输操作的支持。
安全文件传输协议 (SFTP) 是一种网络协议,它让你可以通过任何可靠的流,在互联网上的两台计算机之间传输文件。
SFTP 协议要求有一个安全的通道,例如 SSH,并且在整个 SFTP 会话过程中能够识别客户端的身份。
Spring Integration 通过提供三个客户端端点支持通过 SFTP 发送和接收文件:入站通道适配器、出站通道适配器和出站网关。它还提供了方便的命名空间配置来定义这些客户端组件。
从 6.0 版本开始,过时的 JCraft JSch 客户端已被替换为现代的 Apache MINA SSHD 框架。这在框架组件中引发了许多不兼容的更改。然而,在大多数情况下,这种迁移隐藏在 Spring Integration API 后面。变化最大的是 DefaultSftpSessionFactory
,它现在基于 org.apache.sshd.client.SshClient
并暴露了其中的一些配置属性。
你需要将这个依赖项添加到你的项目中:
- Maven
- Gradle
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-sftp</artifactId>
<version>6.4.2</version>
</dependency>
compile "org.springframework.integration:spring-integration-sftp:6.4.2"
要将 SFTP 命名空间包含在您的 xml 配置中,在根元素上包含以下属性:
xmlns:int-sftp="http://www.springframework.org/schema/integration/sftp"
xsi:schemaLocation="http://www.springframework.org/schema/integration/sftp
https://www.springframework.org/schema/integration/sftp/spring-integration-sftp.xsd"
部分总结
📄️ SFTP 会话工厂
在配置 SFTP 适配器之前,您必须配置一个 SFTP 会话工厂。您可以使用常规的 Bean 定义来配置 SFTP 会话工厂,如下例所示:
📄️ 委托会话工厂
版本 4.2 引入了 DelegatingSessionFactory,它允许在运行时选择实际的会话工厂。在调用 SFTP 端点之前,您可以在工厂上调用 setThreadKey() 将一个键与当前线程关联。然后使用该键查找要使用的实际会话工厂。使用后,您可以通过调用 clearThreadKey() 清除该键。
📄️ SFTP 会话缓存
在 3.0 之前版本中,默认情况下会自动缓存会话。提供了一个 cache-sessions 属性用于禁用自动缓存,但该方案不支持配置其他会话缓存属性。例如,你无法限制创建的会话数量。为了支持这一需求以及其他配置选项,我们添加了 CachingSessionFactory。它提供了 sessionCacheSize 和 sessionWaitTimeout 属性。顾名思义,sessionCacheSize 属性控制工厂在其缓存中维护的活动会话数量(默认是无限制的)。如果达到了 sessionCacheSize 阈值,任何尝试获取另一个会话的操作都将被阻塞,直到缓存中的某个会话可用或会话等待时间到期(默认等待时间是 Integer.MAX\_VALUE)。sessionWaitTimeout 属性允许配置等待时间。
📄️ 使用 RemoteFileTemplate
Spring Integration 3.0 版本提供了对 SftpSession 对象的新抽象。该模板提供了发送、检索(作为 InputStream)、删除和重命名文件的方法。此外,我们提供了一个 execute 方法,让调用者可以在会话上运行多个操作。在所有情况下,模板都可靠地负责关闭会话。有关更多信息,请参阅 RemoteFileTemplate 的 Javadoc。SFTP 有一个子类:SftpRemoteFileTemplate。
📄️ SFTP 入站通道适配器
SFTP 入站通道适配器是一个特殊的监听器,它连接到服务器并监听远程目录事件(例如创建新文件),此时它会发起文件传输。以下示例展示了如何配置 SFTP 入站通道适配器:
📄️ SFTP 流式传输入站通道适配器
Version 4.3 引入了流式入境通道适配器。此适配器生成有效负载类型为 InputStream 的消息,让您可以在不写入本地文件系统的情况下获取文件。由于会话保持打开状态,消费应用程序在文件被消费后负责关闭会话。会话在 closeableResource 头(IntegrationMessageHeaderAccessor.CLOSEABLE\_RESOURCE)中提供。标准框架组件,如 FileSplitter 和 StreamTransformer,会自动关闭会话。有关这些组件的更多信息,请参阅文件拆分器和流转换器。以下示例展示了如何配置 SFTP 流式入境通道适配器:
📄️ 入站通道适配器:轮询多个服务器和目录
从 5.0.7 版本开始,提供了 RotatingServerAdvice;当配置为轮询器建议时,入站适配器可以轮询多个服务器和目录。按照常规方式配置该建议并将其添加到轮询器的建议链中。使用 DelegatingSessionFactory 来选择服务器,详情请参阅 委托会话工厂。建议的配置由一系列 RotationPolicy.KeyDirectory 对象组成。
📄️ 入站通道适配器:控制远程文件获取
在配置入站通道适配器时,您应该考虑两个属性。max-messages-per-poll,如同所有轮询器一样,可以用于限制每次轮询发出的消息数量(如果有超过配置值的消息准备就绪)。max-fetch-size(自 5.0 版本起)可以限制从远程服务器一次检索的文件数量。
📄️ SFTP 外发通道适配器
SFTP 外发通道适配器是一个特殊的 MessageHandler,它连接到远程目录,并为其收到的每个文件(作为传入消息的有效负载)发起文件传输。它还支持文件的几种表示形式,因此您不仅限于 File 对象。类似于 FTP 外发适配器,SFTP 外发通道适配器支持以下有效负载:
📄️ SFTP 外发网关
SFTP outbound 网关提供了一组有限的命令,让您可以与远程 SFTP 服务器进行交互:
📄️ 消息会话回调
从 Spring Integration 4.2 版本开始,您可以使用 MessageSessionCallback\<F, T> 实现与 \<int-sftp:outbound-gateway/> (SftpOutboundGateway) 一起使用,在请求消息上下文中对 Session\<SftpClient.DirEntry> 执行任何操作。您可以将其用于任何非标准或低级别的 SFTP 操作(或多个操作),例如允许从集成流定义或函数式接口(lambda)实现注入访问。以下示例使用了 lambda:
📄️ Apache Mina SFTP 服务器事件
在版本 5.2 中添加的 ApacheMinaSftpEventListener,监听特定的 Apache Mina SFTP 服务器事件,并将它们作为 ApplicationEvent 发布,这些事件可以被任何 ApplicationListener bean、@EventListener bean 方法或 Event Inbound Channel Adapter 接收。
📄️ 远程文件信息
从 5.2 版本开始,SftpStreamingMessageSource (SFTP 流式传入通道适配器)、SftpInboundFileSynchronizingMessageSource (SFTP 传入通道适配器) 和 SftpOutboundGateway (SFTP 传出网关) 的 \"read\" 命令在生成的消息中提供了额外的标头,以提供有关远程文件的信息: