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

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

以下场景假设起始状态是一个空的本地目录

  • max-messages-per-poll=2max-fetch-size=1:适配器抓取一个文件,发出该文件,然后抓取下一个文件并发出。然后它会休眠直到下一次轮询。

  • max-messages-per-poll=2max-fetch-size=2:适配器抓取两个文件,然后发出每个文件。

  • max-messages-per-poll=2max-fetch-size=4:适配器最多抓取 4 个文件(如果可用),并发出前两个文件(如果至少有两个)。接下来的两个文件将在下一次轮询时发出。

  • max-messages-per-poll=2 且未指定 max-fetch-size:适配器抓取所有远程文件,并发出前两个(如果至少有两个)。随后的文件将在后续轮询中发出(每次两个)。当所有文件都已消费后,将再次尝试远程抓取,以获取任何新文件。

部署应用程序的多个实例时,建议设置一个较小的 max-fetch-size,以避免一个实例“霸占”所有文件,导致其他实例“饥饿”。

max-fetch-size 的另一个用途是当你希望停止抓取远程文件,但继续处理已经抓取的文件时。通过编程、JMX 或控制总线MessageSource 上设置 maxFetchSize 属性可以有效地阻止适配器抓取更多文件,但允许轮询器继续为先前已抓取的文件发出消息。如果在属性更改时轮询器处于活动状态,则更改将在下一次轮询时生效。

从版本 5.1 开始,可以为同步器提供一个 Comparator<?>。这在使用 maxFetchSize 限制抓取文件数量时很有用。

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

另请参阅常规的 SFTP 入站通道适配器章节,了解有关 FileListFilter 配置的信息。