远程持久化文件列表过滤器
入站和流式入站远程文件通道适配器(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
;这可能会在未来的版本中发生变化。