入站通道适配器:控制远程文件获取
在配置入站通道适配器时,你应该考虑两个属性。max-messages-per-poll
,如同所有轮询器一样,可以用于限制每次轮询发出的消息数量(如果准备好发送的消息数量超过了配置的值)。max-fetch-size
(自版本 5.0 起)可以限制从远程服务器一次检索的文件数量。
以下场景假设起始状态是空的本地目录:
-
max-messages-per-poll=2
和max-fetch-size=1
:适配器获取一个文件,发出它,获取下一个文件,并发出它。然后它会休眠直到下一次轮询。 -
max-messages-per-poll=2
和max-fetch-size=2
):适配器获取两个文件,然后分别发出每个文件。 -
max-messages-per-poll=2
和max-fetch-size=4
:适配器最多获取 4 个文件(如果可用),并发出前两个文件(如果有至少两个)。接下来的两个文件将在下一次轮询时发出。 -
max-messages-per-poll=2
和未指定max-fetch-size
:适配器获取所有远程文件,并发出前两个文件(如果有至少两个)。后续文件将在后续轮询中发出(每次两个)。当所有文件都被处理后,将再次尝试远程获取,以获取任何新文件。
当你部署一个应用程序的多个实例时,我们建议设置一个较小的 max-fetch-size
,以避免一个实例“抓取”所有文件而导致其他实例饥饿。
max-fetch-size
的另一个用途是在你希望停止获取远程文件但继续处理已经获取的文件时使用。通过在 MessageSource
上设置 maxFetchSize
属性(以编程方式、通过 JMX 或通过 控制总线)可以有效地阻止适配器获取更多文件,但允许轮询器继续为之前已获取的文件发出消息。如果在更改属性时轮询器处于活动状态,则更改将在下次轮询时生效。
从 5.1 版本开始,同步器可以提供一个 Comparator<?>
。这在使用 maxFetchSize
限制获取文件数量时非常有用。
从 6.4 版本开始,AbstractRemoteFileStreamingMessageSource
现在有一个便捷的 clearFetchedCache()
API,用于从缓存中移除未处理的远程文件的引用。这些引用会留在缓存中,因为轮询配置不允许在一个周期内处理所有引用,并且目标 SessionFactory
可能在轮询周期之间发生变化,例如通过 RotatingServerAdvice
。
也请参阅通用的SFTP 入站通道适配器一章,了解 FileListFilter
配置的相关信息。