SFTP 会话工厂

从 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 代理支持。

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 实例,作为 user/host/port 选项的替代。可以使用代理跳板属性进行配置。

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> configurer 属性,用于进一步自定义内部的 SshClient。例如,这是如何更改客户端默认的 NIO 工作线程数和包大小的示例:

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