Spring 集成 SFTP - 过滤器问题和发出的消息数量
Spring integration SFTP - issue with filters and number of messages emits
我开始使用 spring 集成 SFTP,我有一些问题。
- 过滤器不起作用。我有示例配置:
Sftp.inboundAdapter(ftpFileSessionFactory())
.preserveTimestamp(true)
.deleteRemoteFiles(false)
.remoteDirectory(integrationProperties.getRemoteDirectory())
.filter(sftpFileListFilter()) // doesn't work
.patternFilter("*.xlsx") // doesn't work
还有我的 ChainFileListFilter:
private ChainFileListFilter<ChannelSftp.LsEntry> sftpFileListFilter() {
ChainFileListFilter<ChannelSftp.LsEntry> chainFileListFilter = new ChainFileListFilter<>();
chainFileListFilter.addFilter(new SftpPersistentAcceptOnceFileListFilter(metadataStore(), "INT"));
chainFileListFilter.addFilter(new SftpSimplePatternFileListFilter("*.xlsx"));
return chainFileListFilter;
}
如果我没理解错的话,本地目录下应该只保存XLSX文件。如果是,则不适用于此配置。我是做错了什么还是误解了这个?
如何配置 SFTP 让每个下载的文件发出消息?我在文档中看到两个参数 max-messages-per-poll
和 max-fetch-size
,但我不知道如何设置它以便每个文件都发出一条消息。我想每 24 小时同步一次文件并生成批处理作业队列。也许有解决方法?
是否有内置过滤器允许我只获取内容已更改的文件?最好的解决方案是检查文件的校验和。
非常感谢您的帮助和解释。
您不能组合 filter()
和 patternFilter()
。只能使用其中一个:最后一个会覆盖您之前使用的任何内容。换句话说:或 filter()
或 patternFilter()
- 不是两者。默认逻辑是这样的:
public SftpInboundChannelAdapterSpec patternFilter(String pattern) {
return filter(composeFilters(new SftpSimplePatternFileListFilter(pattern)));
}
private CompositeFileListFilter<ChannelSftp.LsEntry> composeFilters(FileListFilter<ChannelSftp.LsEntry>
fileListFilter) {
CompositeFileListFilter<ChannelSftp.LsEntry> compositeFileListFilter = new CompositeFileListFilter<>();
compositeFileListFilter.addFilters(fileListFilter,
new SftpPersistentAcceptOnceFileListFilter(new SimpleMetadataStore(), "sftpMessageSource"));
return compositeFileListFilter;
}
因此,从技术上讲,如果您不使用外部持久性 MetadataStore
,则不需要自定义的。但如果这样做,请考虑将 SftpSimplePatternFileListFilter
与 SftpPersistentAcceptOnceFileListFilter
翻转。因为最好在将文件存储到 MetadataStore
.
之前检查模式
事实上,每个同步的远程文件,通过这些过滤器,都存储在本地目录中,并且当轮询器发出请求时,该本地文件的消息会立即发出。
当我们将远程文件加载到本地目录时,maxFetchSize
发挥作用。 maxMessagesPerPoll
从轮询器中使用,但那些已经从本地文件构建。该消息是按本地文件发出的,而不是作为所有文件的批处理。这不是消息传递的目的。
请分享更多信息,哪些不适用于文件。 SftpPersistentAcceptOnceFileListFilter
不仅检查文件名,还检查文件的 mtime
。因此,它与任何校验和无关,而是文件的更多最后修改时间戳。
我开始使用 spring 集成 SFTP,我有一些问题。
- 过滤器不起作用。我有示例配置:
Sftp.inboundAdapter(ftpFileSessionFactory())
.preserveTimestamp(true)
.deleteRemoteFiles(false)
.remoteDirectory(integrationProperties.getRemoteDirectory())
.filter(sftpFileListFilter()) // doesn't work
.patternFilter("*.xlsx") // doesn't work
还有我的 ChainFileListFilter:
private ChainFileListFilter<ChannelSftp.LsEntry> sftpFileListFilter() {
ChainFileListFilter<ChannelSftp.LsEntry> chainFileListFilter = new ChainFileListFilter<>();
chainFileListFilter.addFilter(new SftpPersistentAcceptOnceFileListFilter(metadataStore(), "INT"));
chainFileListFilter.addFilter(new SftpSimplePatternFileListFilter("*.xlsx"));
return chainFileListFilter;
}
如果我没理解错的话,本地目录下应该只保存XLSX文件。如果是,则不适用于此配置。我是做错了什么还是误解了这个?
如何配置 SFTP 让每个下载的文件发出消息?我在文档中看到两个参数
max-messages-per-poll
和max-fetch-size
,但我不知道如何设置它以便每个文件都发出一条消息。我想每 24 小时同步一次文件并生成批处理作业队列。也许有解决方法?是否有内置过滤器允许我只获取内容已更改的文件?最好的解决方案是检查文件的校验和。
非常感谢您的帮助和解释。
您不能组合 filter()
和 patternFilter()
。只能使用其中一个:最后一个会覆盖您之前使用的任何内容。换句话说:或 filter()
或 patternFilter()
- 不是两者。默认逻辑是这样的:
public SftpInboundChannelAdapterSpec patternFilter(String pattern) {
return filter(composeFilters(new SftpSimplePatternFileListFilter(pattern)));
}
private CompositeFileListFilter<ChannelSftp.LsEntry> composeFilters(FileListFilter<ChannelSftp.LsEntry>
fileListFilter) {
CompositeFileListFilter<ChannelSftp.LsEntry> compositeFileListFilter = new CompositeFileListFilter<>();
compositeFileListFilter.addFilters(fileListFilter,
new SftpPersistentAcceptOnceFileListFilter(new SimpleMetadataStore(), "sftpMessageSource"));
return compositeFileListFilter;
}
因此,从技术上讲,如果您不使用外部持久性 MetadataStore
,则不需要自定义的。但如果这样做,请考虑将 SftpSimplePatternFileListFilter
与 SftpPersistentAcceptOnceFileListFilter
翻转。因为最好在将文件存储到 MetadataStore
.
事实上,每个同步的远程文件,通过这些过滤器,都存储在本地目录中,并且当轮询器发出请求时,该本地文件的消息会立即发出。
当我们将远程文件加载到本地目录时,maxFetchSize
发挥作用。 maxMessagesPerPoll
从轮询器中使用,但那些已经从本地文件构建。该消息是按本地文件发出的,而不是作为所有文件的批处理。这不是消息传递的目的。
请分享更多信息,哪些不适用于文件。 SftpPersistentAcceptOnceFileListFilter
不仅检查文件名,还检查文件的 mtime
。因此,它与任何校验和无关,而是文件的更多最后修改时间戳。