如需使用最新稳定版本,请使用 Spring Integration 7.0.4spring-doc.cadn.net.cn

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 会话工厂依赖 Apache MINA SSHD 库来提供 SFTP 功能。spring-doc.cadn.net.cn

然而,Spring Integration 也支持 SFTP 会话的缓存。 有关更多信息,请参阅 SFTP 会话缓存spring-doc.cadn.net.cn

The DefaultSftpSessionFactory can use an externally configured or extended SshClient. For example, the org.eclipse.jgit.internal.transport.sshd.JGitSshClient extension from the org.eclipse.jgit:org.eclipse.jgit.ssh.apache library may be used to provide support for HTTP/SOCKS proxies.

The SshClient 支持通过连接到服务器的连接进行多个通道(操作)。 默认情况下,Spring Integration 会话工厂为每个通道使用单独的物理连接。 自 Spring Integration 3.0 起,您可以配置会话工厂(使用布尔构造函数参数 - 默认值为 false),以使用单个连接到服务器,并在该单个连接上创建多个 SftpClient 实例。spring-doc.cadn.net.cn

使用此功能时,必须将会话工厂包装在缓存会话工厂中,如稍后所述,以便在操作完成后连接不会被物理关闭。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。 下面是一个示例,展示如何在您的自定义 SftpClient 中重写 createSftpChannelSubsystem() 方法,例如为 SFTP 子系统的请求和响应添加一些自定义的 RequestHandlerspring-doc.cadn.net.cn

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

配置属性

以下列表描述了由 DefaultSftpSessionFactory 暴露的所有属性。spring-doc.cadn.net.cn

isSharedSession (构造函数参数)::当true时,所有请求的SftpSession实例将使用单个SftpClient。 默认值为falsespring-doc.cadn.net.cn

sftpVersionSelector::SFTP协议选择的实例。 默认值为SftpVersionSelector.CURRENTspring-doc.cadn.net.cn

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

hostConfig::作为用户/主机/端口选项的替代方案,指定一个实例。 可以使用代理跳转属性进行配置。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::用于验证远程主机的密码。 如果未提供密码,则必须设置 privateKey 属性。spring-doc.cadn.net.cn

privateKey::表示用于向远程主机进行身份验证的私钥位置的 org.springframework.core.io.Resource。 如果未提供 privateKey,则必须提供 password 属性。spring-doc.cadn.net.cn

privateKeyPassphrase::私钥的密码。 如果您设置了 userInfo,则不允许设置 privateKeyPassphrase。 密码短语从该对象中获取。 可选。spring-doc.cadn.net.cn

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

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

userInteraction::身份验证期间使用的自定义 org.apache.sshd.client.auth.keyboard.UserInteractionspring-doc.cadn.net.cn

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

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