入站通道适配器:控制远程文件获取

在配置入站通道适配器时,您应该考虑两个属性。 max-messages-per-poll:与所有轮询器一样,可用于限制每次轮询发出的消息数量(如果准备好的消息超过配置值)。 max-fetch-size(自 5.0 版本起)可限制从远程服务器一次性检索的文件数量。spring-doc.cadn.net.cn

以下场景假设起始状态是一个空的本地目录:spring-doc.cadn.net.cn

  • max-messages-per-poll=2max-fetch-size=1:适配器获取一个文件,将其发出,然后获取下一个文件并再次发出。 随后它会休眠直到下一次轮询。spring-doc.cadn.net.cn

  • max-messages-per-poll=2 and max-fetch-size=2: 适配器获取这两个文件,然后依次发出每一个。spring-doc.cadn.net.cn

  • max-messages-per-poll=2 and max-fetch-size=4: The adapter fetches up to 4 files (if available) and emits the first two (if there are at least two). The next two files will be emitted in the next poll.spring-doc.cadn.net.cn

  • max-messages-per-poll=2max-fetch-size 未指定:适配器会获取所有远程文件并输出前两个(如果至少有两个)。 后续的文件将在后续的轮询中输出(每次两个)。 当所有文件都被消费后,将再次尝试远程获取以捕获任何新文件。spring-doc.cadn.net.cn

当您部署多个应用实例时,我们建议设置一个较小的 max-fetch-size,以避免单个实例“抢占”所有文件而导致其他实例资源饥饿。

max-fetch-size 用于另一种场景是:当您希望停止获取远程文件,但继续处理已获取的文件时。 在 MessageSource(通过编程方式、JMX 或 控制总线)上设置 maxFetchSize 属性,可有效阻止适配器继续获取新文件,同时允许轮询器继续为之前已获取的文件发送消息。 如果更改属性时轮询器处于活动状态,则更改将在下一次轮询时生效。spring-doc.cadn.net.cn

从版本 5.1 开始,同步器可以接收一个 Comparator<?>。 当限制获取的文件数量为 maxFetchSize 时,这非常有用。spring-doc.cadn.net.cn

从版本 6.4 开始,AbstractRemoteFileStreamingMessageSource 现在提供了一个便捷的 clearFetchedCache() API,用于从缓存中移除未处理的远程文件的引用。 这些引用仍保留在缓存中,因为轮询配置不允许在一个周期内处理所有引用,并且在轮询周期之间目标 SessionFactory 可能会发生变化,例如通过 RotatingServerAdvicespring-doc.cadn.net.cn

从 7.0 版本开始,AbstractInboundFileSynchronizer 在应用 maxFetchSize 切片后缓存一个过滤后的 Session.list(remoteDirectory)AbstractInboundFileSynchronizer.transferFilesFromRemoteToLocal() 方法的逻辑如下:spring-doc.cadn.net.cn

  • 如果为maxFetchSize > 0,则在remoteDirectory上获取锁以避免在缓存相关操作期间不同线程之间的竞态条件。 性能下降极小,因为后续的所有同步操作仅处理内存中缓存的剩余数据;spring-doc.cadn.net.cn

  • 如果不存在remoteDirectory的缓存条目,则调用Session.list(remoteDirectory)并过滤所有返回的远程文件;spring-doc.cadn.net.cn

  • 过滤后的结果随后被切片至 maxFetchSizespring-doc.cadn.net.cn

  • then these file entries are being transferred to the local directory;spring-doc.cadn.net.cn

  • 其余的过滤远程文件将被缓存以供后续同步使用;spring-doc.cadn.net.cn

  • 如果存在针对 remoteDirectory 的缓存条目,则将该列表截取到 maxFetchSize 并迭代以传输到本地目录;spring-doc.cadn.net.cn

  • 如果其中一个传输失败,则从失败的远程文件中重置filter。 缓存也会被清除;因此,下一次同步将从干净的状态开始。spring-doc.cadn.net.cn

另请参阅一般的 SFTP 入站通道适配器 章节,以获取有关 FileListFilter 配置的信息。spring-doc.cadn.net.cn