远程持久文件列表过滤器
入站和流式入站远程文件通道适配器(FTP
、SFTP
和其他技术)默认配置了 AbstractPersistentFileListFilter
的相应实现,并配置了内存中的 MetadataStore
。
要在集群中运行,这些过滤器可以使用共享的 MetadataStore
替换(有关更多信息,请参阅 Metadata Store)。
这些过滤器用于防止多次获取同一个文件(除非其修改时间发生变化)。
从版本 5.2 开始,文件在获取之前立即添加到过滤器中(如果获取失败则回滚)。
在发生灾难性故障(例如断电)时,当前正在获取的文件可能会保留在过滤器中,并且在应用程序重新启动时不会被重新获取。
在这种情况下,您需要手动从 MetadataStore
中删除此文件。
在以前的版本中,文件在任何文件被获取之前就被过滤了,这意味着在灾难性故障后,有几个文件可能处于这种状态。
为了促进这种新行为,FileListFilter
中添加了两个新方法。
boolean accept(F file);
boolean supportsSingleFileFiltering();
如果过滤器在 supportsSingleFileFiltering
中返回 true
,则它 必须 实现 accept()
。
如果远程过滤器不支持单个文件过滤(例如 AbstractMarkerFilePresentFileListFilter
),则适配器将恢复到之前的行为。
如果使用了多个过滤器(使用 CompositeFileListFilter
或 ChainFileListFilter
),则所有委托过滤器都必须支持单个文件过滤,以便复合过滤器支持它。
持久文件列表过滤器现在有一个布尔属性 forRecursion
。
将此属性设置为 true
,也会设置 alwaysAcceptDirectories
,这意味着出站网关(ls
和 mget
)上的递归操作现在每次都会遍历完整的目录树。
这是为了解决未检测到目录树深处更改的问题。
此外,forRecursion=true
会导致将文件的完整路径用作元数据存储键;这解决了当同一名称的文件在不同目录中多次出现时过滤器无法正常工作的问题。
IMPORTANT: 这意味着在持久元数据存储中,顶层目录下的文件的现有键将无法找到。
因此,该属性默认为 false
;这可能会在未来的版本中更改。