入站通道介面卡:控制遠端檔案抓取
配置入站通道介面卡時,應考慮兩個屬性。與所有輪詢器一樣,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。
從版本 7.0 開始,AbstractInboundFileSynchronizer 在應用 maxFetchSize 切片後快取一個過濾的 Session.list(remoteDirectory)。AbstractInboundFileSynchronizer.transferFilesFromRemoteToLocal() 方法的邏輯如下:
-
如果
maxFetchSize > 0,則會針對remoteDirectory獲取鎖,以避免在快取工作時不同執行緒的競態條件。效能下降最小,因為所有後續同步都只處理記憶體中快取的剩餘部分; -
如果
remoteDirectory沒有快取條目,則呼叫Session.list(remoteDirectory)並過濾所有返回的遠端檔案; -
然後將過濾結果切片到
maxFetchSize; -
然後將這些檔案條目傳輸到本地目錄;
-
其餘的過濾遠端檔案被快取以供後續同步;
-
如果
remoteDirectory有快取條目,則將此類列表切片到maxFetchSize並迭代以傳輸到本地目錄; -
如果其中一個傳輸失敗,則
filter將從失敗的遠端檔案重置。快取也會被清除;因此,下一次同步將從一個乾淨的狀態開始。
另請參閱一般 SFTP 入站通道介面卡 章節,瞭解有關 FileListFilter 配置的資訊。