遠端持久檔案列表過濾器
入站和流式入站遠端檔案通道介面卡(FTP、SFTP 及其他技術)預設配置了相應的 AbstractPersistentAcceptOnceFileListFilter 實現,並配置了一個記憶體中的 MetadataStore。要在叢集中執行,可以將這些過濾器替換為使用共享 MetadataStore 的過濾器(有關更多資訊,請參閱 Metadata Store)。這些過濾器用於防止多次獲取同一個檔案(除非其修改時間發生變化)。從版本 5.2 開始,檔案在獲取之前立即新增到過濾器中(如果獲取失敗則回滾)。
從版本 7.0 開始,所有 AbstractPersistentAcceptOnceFileListFilter 實現都使用“長檔名”(獲取目錄加上簡單檔名)作為元資料條目鍵。以前,僅使用檔名可能會導致當相同的過濾器用於具有相同檔名的不同目錄時,元資料被覆蓋的問題。例如,RotatingServerAdvice 可能會根據時間戳切換目錄,但檔案會根據業務邏輯以相同的名稱放置在這些目錄中。如果 directory1 和 directory2 都包含一個 someFile,則它們的元資料將分別儲存為 directory1/someFile 和 directory2/someFile。這是在過濾器提供 prefix 選項為空字串的情況下,否則該字首將新增到最終鍵中。
在發生災難性故障(例如斷電)時,當前正在獲取的檔案可能會保留在過濾器中,並且在應用程式重新啟動時不會重新獲取。在這種情況下,您需要手動將此檔案從 MetadataStore 中移除。 |
在之前的版本中,檔案是在獲取任何檔案之前就被過濾的,這意味著在發生災難性故障後,會有多個檔案處於這種狀態。
為了方便這種新行為,FileListFilter 中添加了兩個新方法。
boolean accept(F file);
boolean supportsSingleFileFiltering();
如果過濾器在 supportsSingleFileFiltering 中返回 true,則它必須實現 accept()。
如果遠端過濾器不支援單檔案過濾(例如 AbstractMarkerFilePresentFileListFilter),則介面卡會恢復到之前的行為。
如果使用了多個過濾器(CompositeFileListFilter 或 ChainFileListFilter),那麼所有委託過濾器都必須支援單檔案過濾,複合過濾器才能支援它。
持久檔案列表過濾器現在有一個布林屬性 forRecursion。將此屬性設定為 true,還會設定 alwaysAcceptDirectories,這意味著出站閘道器上的遞迴操作(ls 和 mget)現在每次都會遍歷完整的目錄樹。這是為了解決目錄樹深處的變化未被檢測到的問題。此外,forRecursion=true 會導致檔案的完整路徑用作元資料儲存鍵;這解決了如果具有相同名稱的檔案在不同目錄中多次出現時過濾器無法正常工作的問題。重要提示:這意味著在頂層目錄下的檔案中,持久元資料儲存中的現有鍵將找不到。因此,此屬性預設為 false;這可能會在未來的版本中更改。