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>7.0.2</version>
</dependency>
compile "org.springframework.integration:spring-integration-sftp:7.0.2"
要在您的 XML 配置中包含 SFTP 命名空间,请在根元素上包含以下属性:
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 流式入站通道适配器
版本 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出站通道适配器是一种特殊的消息处理器,它连接到远程目录,并为接收到的每个文件(作为传入消息的有效载荷)发起文件传输。它还支持文件的多种表示形式,因此您不仅限于使用文件对象。与FTP出站适配器类似,SFTP出站通道适配器支持以下有效载荷类型:
📄️ SFTP 出站网关
SFTP出站网关提供了一组有限的命令,使您能够与远程SFTP服务器进行交互:
📄️ MessageSessionCallback
从 Spring Integration 版本 4.2 开始,你可以将 MessageSessionCallback\<F, T> 实现与 int-sftp:outbound-gateway/ (SftpOutboundGateway) 结合使用,以便在 Session\<SftpClient.DirEntry> 中结合请求消息上下文执行任何操作。你可以将其用于任何非标准或底层的 SFTP 操作(或一系列操作),例如允许从集成流定义或函数式接口(lambda)实现注入进行访问。以下示例使用了 lambda 表达式:
📄️ Apache Mina SFTP 服务器事件
ApacheMinaSftpEventListener 自 5.2 版本起新增,用于监听特定的 Apache Mina SFTP 服务器事件,并将这些事件发布为 ApplicationEvent。这些事件可以被任何 ApplicationListener bean、@EventListener bean 方法或 Event Inbound Channel Adapter 接收。
📄️ 远程文件信息
从 5.2 版本开始,SftpStreamingMessageSource(SFTP 流式入站通道适配器)、SftpInboundFileSynchronizingMessageSource(SFTP 入站通道适配器)以及 SftpOutboundGateway(SFTP 出站网关)的 \"read\" 命令会在生成的消息中提供额外的头部信息,这些信息包含有关远程文件的信息: