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