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