跳到主要内容
版本:7.0.2

SFTP 会话工厂

DeepSeek V3 中英对照 SFTP Session Factory

important

自 3.0 版本起,会话默认不再缓存。请参阅 SFTP 会话缓存

在配置 SFTP 适配器之前,必须先配置 SFTP 会话工厂。您可以通过常规的 bean 定义来配置 SFTP 会话工厂,如下例所示:

<beans:bean id="sftpSessionFactory"
class="org.springframework.integration.sftp.session.DefaultSftpSessionFactory">
<beans:property name="host" value="localhost"/>
<beans:property name="privateKey" value="classpath:META-INF/keys/sftpTest"/>
<beans:property name="privateKeyPassphrase" value="springIntegration"/>
<beans:property name="port" value="22"/>
<beans:property name="user" value="kermit"/>
</beans:bean>

每当适配器从其 SessionFactory 请求会话对象时,都会创建一个新的 SFTP 会话。在底层,SFTP 会话工厂依赖于 Apache MINA SSHD 库来提供 SFTP 功能。

然而,Spring Integration 也支持 SFTP 会话的缓存。更多信息请参阅 SFTP 会话缓存

备注

DefaultSftpSessionFactory 可以使用外部配置或扩展的 SshClient。例如,来自 org.eclipse.jgit:org.eclipse.jgit.ssh.apache 库的 org.eclipse.jgit.internal.transport.sshd.JGitSshClient 扩展可用于提供对 HTTP/SOCKS 代理的支持。

important

SshClient 支持通过单个服务器连接建立多个通道(操作)。默认情况下,Spring Integration 会话工厂为每个通道使用独立的物理连接。自 Spring Integration 3.0 起,你可以配置会话工厂(通过布尔型构造参数,默认为 false)使其使用单个服务器连接,并在该连接上创建多个 SftpClient 实例。

使用此功能时,必须将会话工厂包装在缓存会话工厂中,如后续章节所述,以确保操作完成时连接不会被物理关闭。

如果缓存被重置,仅当最后一个通道关闭时,会话才会断开连接。

当新操作获取会话时,若连接即将断开,则会自动刷新该连接。

现在,你只需将此 SFTP 会话工厂注入到你的适配器中。

备注

为SFTP会话工厂提供值的一种更实用的方法是使用Spring的属性占位符支持

从 6.1.3 版本开始,DefaultSftpSessionFactory 引入了 createSftpClient(…​) 方法以支持自定义的 SftpClient。以下示例展示了如何在自定义的 SftpClient 中重写 createSftpChannelSubsystem() 方法,例如,为 SFTP 子系统请求和响应添加一些自定义的 RequestHandler

@Override
protected ChannelSubsystem createSftpChannelSubsystem(ClientSession clientSession) {
ChannelSubsystem sftpChannelSubsystem = super.createSftpChannelSubsystem(clientSession);
sftpChannelSubsystem.addRequestHandler((channel, request, wantReply, buffer) -> ...);
return sftpChannelSubsystem;
}

配置属性

以下列表描述了 DefaultSftpSessionFactory 所暴露的所有属性。

isSharedSession (构造函数参数)::当设置为 true 时,所有请求的 SftpSession 实例将共享同一个 SftpClient。默认值为 false

sftpVersionSelector::一个用于SFTP协议选择的SftpVersionSelector实例。默认值为SftpVersionSelector.CURRENT

host:: 要连接的主机的 URL。必需。

hostConfig:: 一个 org.apache.sshd.client.config.hosts.HostConfigEntry 实例,作为用户/主机/端口选项的替代方案。可通过代理跳转属性进行配置。

port:: 用于建立 SFTP 连接的端口。如果未指定,此值默认为 22。如果指定,该属性必须为正数。

user:: 要使用的远程用户。必需。

knownHostsResource::一个用于主机密钥仓库的 org.springframework.core.io.Resource。该资源的内容必须与 OpenSSH known_hosts 文件的格式相同,并且是必需的;如果 allowUnknownKeys 为 false,则必须预先填充此资源。

password::用于对远程主机进行身份验证的密码。如果未提供密码,则必须提供 privateKey 属性。

privateKey:: 一个 org.springframework.core.io.Resource 类型,表示用于远程主机身份验证的私钥位置。如果未提供 privateKey,则必须提供 password 属性。

privateKeyPassphrase::私钥的密码。如果设置了 userInfo,则不允许使用 privateKeyPassphrase。密码将从该对象中获取。可选。

timeout::timeout 属性用作套接字超时参数,同时也是默认的连接超时时间。默认值为 30 秒。设置为 0 表示无超时;设置为 null 表示无限等待。

allowUnknownKeys:: 设置为 true 以允许连接到具有未知(或已更改)密钥的主机。其默认值为 false。如果为 false,则需要一个预先填充的 knownHosts 文件。

userInteraction:: 一个自定义的 org.apache.sshd.client.auth.keyboard.UserInteraction,用于在认证过程中使用。

从 6.4 版本开始,DefaultSftpSessionFactory 暴露了一个 Consumer<SshClient> 配置器属性,用于进一步自定义内部 SshClient。例如,以下是如何更改客户端的默认 NIO 工作线程数和数据包大小:

sftpSessionFactory.setSshClientConfigurer((sshClient) -> {
sshClient.setNioWorkers(27);
PropertyResolverUtils.updateProperty(sshClient, CoreModuleProperties.MAX_PACKET_SIZE.getName(), 48 * 1024);
});