|
此版本仍在开发中,尚未被视为稳定版。如需最新稳定版本,请使用 Spring Integration 7.0.4! |
远程持久化文件列表过滤器
入站和流式入站远程文件通道适配器(FTP、SFTP及其他技术)默认使用相应的AbstractPersistentAcceptOnceFileListFilter实现进行配置,并配合基于内存的MetadataStore。
要在集群中运行,这些适配器可替换为使用共享MetadataStore的过滤器(有关更多信息,请参阅元数据存储)。
这些过滤器用于防止重复获取同一文件(除非其修改时间发生变化)。
从版本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;此行为可能在未来的版本中发生变化。