|
如需使用最新稳定版本,请使用 Spring Integration 7.0.4! |
远程持久化文件列表过滤器
入站和流式入站远程文件通道适配器(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;此行为可能在未来的版本中发生变化。