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 会话缓存。
|
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
::超时属性用作套接字超时参数以及默认连接超时。
默认为 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);
});