遠端持久檔案列表過濾器
預設情況下,輸入和串流輸入遠端檔案通道配接器 (FTP
、SFTP
和其他技術) 會配置對應的 AbstractPersistentFileListFilter
實作,並使用記憶體內 MetadataStore
進行設定。為了在叢集中運行,這些可以替換為使用共用 MetadataStore
的過濾器 (詳情請參閱 元數據儲存)。這些過濾器用於防止多次擷取相同檔案 (除非檔案的修改時間變更)。從 5.2 版本開始,檔案會在擷取之前立即新增至過濾器 (如果擷取失敗則會還原)。
如果發生災難性故障 (例如停電),目前正在擷取的檔案可能會保留在過濾器中,並且在重新啟動應用程式時不會重新擷取。在這種情況下,您需要手動從 MetadataStore 中移除此檔案。 |
在先前的版本中,檔案會在擷取之前進行過濾,這表示在災難性故障之後,可能有數個檔案處於這種狀態。
為了促進這種新行為,FileListFilter
新增了兩個方法。
boolean accept(F file);
boolean supportsSingleFileFiltering();
如果過濾器在 supportsSingleFileFiltering
中傳回 true
,則必須實作 accept()
。
如果遠端過濾器不支援單一檔案過濾 (例如 AbstractMarkerFilePresentFileListFilter
),則配接器會還原為先前的行為。
如果使用多個過濾器 (使用 CompositeFileListFilter
或 ChainFileListFilter
),則所有委派過濾器都必須支援單一檔案過濾,複合過濾器才能支援。
持久檔案列表過濾器現在有一個布林屬性 forRecursion
。將此屬性設定為 true
,也會設定 alwaysAcceptDirectories
,這表示輸出閘道器 (ls
和 mget
) 上的遞迴操作現在每次都會完整遍歷整個目錄樹。這是為了解決目錄樹深處的變更未被偵測到的問題。此外,forRecursion=true
會導致使用檔案的完整路徑作為元數據儲存金鑰;這解決了當同名檔案多次出現在不同目錄中時,過濾器無法正常運作的問題。重要事項:這表示在持久元數據儲存中,頂層目錄下方的檔案現有金鑰將無法找到。因此,此屬性預設為 false
;這可能會在未來版本中變更。