遠端持久檔案列表過濾器

預設情況下,輸入和串流輸入遠端檔案通道配接器 (FTPSFTP 和其他技術) 會配置對應的 AbstractPersistentFileListFilter 實作,並使用記憶體內 MetadataStore 進行設定。為了在叢集中運行,這些可以替換為使用共用 MetadataStore 的過濾器 (詳情請參閱 元數據儲存)。這些過濾器用於防止多次擷取相同檔案 (除非檔案的修改時間變更)。從 5.2 版本開始,檔案會在擷取之前立即新增至過濾器 (如果擷取失敗則會還原)。

如果發生災難性故障 (例如停電),目前正在擷取的檔案可能會保留在過濾器中,並且在重新啟動應用程式時不會重新擷取。在這種情況下,您需要手動從 MetadataStore 中移除此檔案。

在先前的版本中,檔案會在擷取之前進行過濾,這表示在災難性故障之後,可能有數個檔案處於這種狀態。

為了促進這種新行為,FileListFilter 新增了兩個方法。

boolean accept(F file);

boolean supportsSingleFileFiltering();

如果過濾器在 supportsSingleFileFiltering 中傳回 true,則必須實作 accept()

如果遠端過濾器不支援單一檔案過濾 (例如 AbstractMarkerFilePresentFileListFilter),則配接器會還原為先前的行為。

如果使用多個過濾器 (使用 CompositeFileListFilterChainFileListFilter),則所有委派過濾器都必須支援單一檔案過濾,複合過濾器才能支援。

持久檔案列表過濾器現在有一個布林屬性 forRecursion。將此屬性設定為 true,也會設定 alwaysAcceptDirectories,這表示輸出閘道器 (lsmget) 上的遞迴操作現在每次都會完整遍歷整個目錄樹。這是為了解決目錄樹深處的變更未被偵測到的問題。此外,forRecursion=true 會導致使用檔案的完整路徑作為元數據儲存金鑰;這解決了當同名檔案多次出現在不同目錄中時,過濾器無法正常運作的問題。重要事項:這表示在持久元數據儲存中,頂層目錄下方的檔案現有金鑰將無法找到。因此,此屬性預設為 false;這可能會在未來版本中變更。