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