遠端持久化檔案列表過濾器
入站和流式入站遠端檔案通道介面卡(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
;這可能會在未來的版本中發生變化。