|
此版本仍在开发中,尚未被视为稳定版。如需最新稳定版本,请使用 Spring Integration 7.0.4! |
入站通道适配器:控制远程文件获取
在配置入站通道适配器时,您应该考虑两个属性。
max-messages-per-poll:与所有轮询器一样,可用于限制每次轮询发出的消息数量(如果准备好的消息超过配置值)。
max-fetch-size(自 5.0 版本起)可限制从远程服务器一次性检索的文件数量。
以下场景假设起始状态是一个空的本地目录:
-
max-messages-per-poll=2和max-fetch-size=1:适配器获取一个文件,将其发出,然后获取下一个文件并再次发出。 随后它会休眠直到下一次轮询。 -
max-messages-per-poll=2andmax-fetch-size=2: 适配器获取这两个文件,然后依次发出每一个。 -
max-messages-per-poll=2andmax-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. -
max-messages-per-poll=2和max-fetch-size未指定:适配器会获取所有远程文件并输出前两个(如果至少有两个)。 后续的文件将在后续的轮询中输出(每次两个)。 当所有文件都被消费后,将再次尝试远程获取以捕获任何新文件。
当您部署多个应用实例时,我们建议设置一个较小的 max-fetch-size,以避免单个实例“抢占”所有文件而导致其他实例资源饥饿。 |
将 max-fetch-size 用于另一种场景是:当您希望停止获取远程文件,但继续处理已获取的文件时。
在 MessageSource(通过编程方式、JMX 或 控制总线)上设置 maxFetchSize 属性,可有效阻止适配器继续获取新文件,同时允许轮询器继续为之前已获取的文件发送消息。
如果更改属性时轮询器处于活动状态,则更改将在下一次轮询时生效。
从版本 5.1 开始,同步器可以接收一个 Comparator<?>。
当限制获取的文件数量为 maxFetchSize 时,这非常有用。
从版本 6.4 开始,AbstractRemoteFileStreamingMessageSource 现在提供了一个便捷的 clearFetchedCache() API,用于从缓存中移除未处理的远程文件的引用。
这些引用仍保留在缓存中,因为轮询配置不允许在一个周期内处理所有引用,并且在轮询周期之间目标 SessionFactory 可能会发生变化,例如通过 RotatingServerAdvice。
从 7.0 版本开始,AbstractInboundFileSynchronizer 在应用 maxFetchSize 切片后缓存一个过滤后的 Session.list(remoteDirectory)。
AbstractInboundFileSynchronizer.transferFilesFromRemoteToLocal() 方法的逻辑如下:
-
如果为
maxFetchSize > 0,则在remoteDirectory上获取锁以避免在缓存相关操作期间不同线程之间的竞态条件。 性能下降极小,因为后续的所有同步操作仅处理内存中缓存的剩余数据; -
如果不存在
remoteDirectory的缓存条目,则调用Session.list(remoteDirectory)并过滤所有返回的远程文件; -
过滤后的结果随后被切片至
maxFetchSize; -
then these file entries are being transferred to the local directory;
-
其余的过滤远程文件将被缓存以供后续同步使用;
-
如果存在针对
remoteDirectory的缓存条目,则将该列表截取到 maxFetchSize 并迭代以传输到本地目录; -
如果其中一个传输失败,则从失败的远程文件中重置
filter。 缓存也会被清除;因此,下一次同步将从干净的状态开始。
另请参阅一般的 SFTP 入站通道适配器 章节,以获取有关 FileListFilter 配置的信息。