SFTP 会话缓存

从 Spring Integration 3.0 版本开始,默认情况下不再缓存会话。cache-sessions 属性不再在端点上受支持。如果您希望缓存会话,则必须使用 CachingSessionFactory(请参阅下一个示例)。

在 3.0 之前的版本中,会话默认情况下会自动缓存。可以使用 cache-sessions 属性来禁用自动缓存,但该解决方案无法配置其他会话缓存属性。例如,您无法限制创建的会话数量。为了支持该需求和其他配置选项,我们添加了 CachingSessionFactory。它提供了 sessionCacheSizesessionWaitTimeout 属性。顾名思义,sessionCacheSize 属性控制工厂在缓存中维护多少个活动会话(默认情况下是不受限制的)。如果已达到 sessionCacheSize 阈值,任何尝试获取另一个会话的操作都会阻塞,直到缓存中的会话之一可用或会话的等待时间过期(默认等待时间为 Integer.MAX_VALUE)。sessionWaitTimeout 属性允许配置等待时间。

如果您希望缓存会话,请配置您的默认会话工厂(如 前面所述),然后将其包装在 CachingSessionFactory 的实例中,您可以在其中提供这些附加属性。以下示例展示了如何操作。

<bean id="sftpSessionFactory"
    class="org.springframework.integration.sftp.session.DefaultSftpSessionFactory">
    <property name="host" value="localhost"/>
</bean>

<bean id="cachingSessionFactory"
    class="org.springframework.integration.file.remote.session.CachingSessionFactory">
    <constructor-arg ref="sftpSessionFactory"/>
    <constructor-arg value="10"/>
    <property name="sessionWaitTimeout" value="1000"/>
</bean>

上面的示例创建了一个 CachingSessionFactory,其 sessionCacheSize 设置为 10sessionWaitTimeout 设置为一秒(1000 毫秒)。

从 Spring Integration 版本 3.0 开始,CachingConnectionFactory 提供了一个 resetCache() 方法。当调用该方法时,所有空闲会话都会立即关闭,正在使用的会话在返回到缓存时会关闭。当使用 isSharedSession=true 时,通道会关闭,共享会话仅在最后一个通道关闭时关闭。对会话的新请求会根据需要建立新的会话。

从 5.1 版本开始,CachingSessionFactory 有一个新的属性 testSession。当为 true 时,会话将通过对空路径执行 REALPATH 命令来测试,以确保它仍然处于活动状态;如果不是,它将从缓存中删除;如果缓存中没有活动会话,则会创建一个新会话。