SFTP 会话工厂

从版本 3.0 开始,默认情况下不再缓存会话。 请参阅 SFTP 会话缓存

在配置 SFTP 适配器之前,必须配置 SFTP 会话工厂。 您可以使用常规 bean 定义配置 SFTP 会话工厂,如下例所示:spring-doc.cadn.net.cn

<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 Session Factory 依赖于 Apache MINA SSHD 库来提供 SFTP 功能。spring-doc.cadn.net.cn

但是, Spring 集成还支持 SFTP 会话的缓存。 有关更多信息,请参阅 SFTP 会话缓存spring-doc.cadn.net.cn

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

SshClient支持通过与服务器的连接使用多个通道 (作)。 默认情况下, Spring 集成会话工厂为每个通道使用单独的物理连接。 从 Spring Integration 3.0 开始,你可以配置会话工厂(使用布尔构造函数 arg - defaultfalse) 使用与服务器的单个连接并创建多个SftpClient实例。spring-doc.cadn.net.cn

使用此功能时,必须将 session factory 包装在缓存 session factory 中,如下所述,以便在作完成时不会物理关闭连接。spring-doc.cadn.net.cn

如果重置缓存,则仅当最后一个通道关闭时,会话才会断开连接。spring-doc.cadn.net.cn

如果在新作获取会话时断开连接,则会刷新连接。spring-doc.cadn.net.cn

现在您需要做的就是将此 SFTP 会话工厂注入到您的适配器中。spring-doc.cadn.net.cn

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

从版本 6.1.3 开始,DefaultSftpSessionFactory引入了createSftpClient(…​)支持自定义SftpClient. 请参阅下面的示例,了解如何覆盖createSftpChannelSubsystem()method 添加到您的自定义SftpClient例如,添加一些自定义RequestHandler对于 SFTP 子系统请求和回复:spring-doc.cadn.net.cn

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

配置属性

isSharedSession(constructor argument)::当true、单个SftpClient用于所有请求的SftpSession实例。 它默认为false.spring-doc.cadn.net.cn

sftpVersionSelector::一SftpVersionSelectorinstance 进行 SFTP 协议选择。 默认值为SftpVersionSelector.CURRENT.spring-doc.cadn.net.cn

host::要连接到的主机的 URL。 必填。spring-doc.cadn.net.cn

hostConfig::一org.apache.sshd.client.config.hosts.HostConfigEntry实例作为 user/host/port 选项的替代项。 可以使用代理跳转属性进行配置。spring-doc.cadn.net.cn

port::应通过其建立 SFTP 连接的端口。 如果未指定,此值默认为22. 如果指定,则此属性必须为正数。spring-doc.cadn.net.cn

user::要使用的远程用户。 必填。spring-doc.cadn.net.cn

knownHostsResource::一org.springframework.core.io.Resource用于主机密钥存储库。 资源的内容必须与 OpenSSH 的格式相同known_hosts文件,并且是必需的,如果allowUnknownKeys为 false。spring-doc.cadn.net.cn

password::用于对远程主机进行身份验证的密码。 如果未提供密码,则privateKeyproperty 是必需的。spring-doc.cadn.net.cn

privateKey::一org.springframework.core.io.Resource该 ID 表示用于对远程主机进行身份验证的私有密钥的位置。 如果privateKey未提供,则passwordproperty 是必需的。spring-doc.cadn.net.cn

privateKeyPassphrase::私钥的密码。 如果您将userInfo,privateKeyPassphrase不允许。 密码是从该对象获取的。 自选。spring-doc.cadn.net.cn

timeout::timeout 属性用作套接字超时参数,以及默认连接超时。 默认为30 seconds. 设置为0表示无超时;自null- 无限等待。spring-doc.cadn.net.cn

allowUnknownKeys::设置为true以允许连接到具有未知(或更改)密钥的主机。 它的默认值是 'false'。 如果false,则预填充的knownHostsfile 是必需的。spring-doc.cadn.net.cn

userInteraction::A 定制org.apache.sshd.client.auth.keyboard.UserInteraction在身份验证期间使用。spring-doc.cadn.net.cn

从版本 6.4 开始,DefaultSftpSessionFactory公开一个Consumer<SshClient>configurer 属性来进一步自定义内部SshClient. 例如,以下是更改客户端的默认 NIO 工作线程数量和数据包大小的方法:spring-doc.cadn.net.cn

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