我遇到了一个问题,当我使用Spring-Integration-sftp从SFTP服务器拉取文件并进行一些处理时.我用RedisMetadataStore为我的SftpPersistentAcceptOnceFileListFilter提供动力.我在我的用例中使用了Streaming Inbound Channel Adapter.

问题是,一旦将新的文件事件传递给我的处理程序,该文件就会在Redis元数据存储中标记为已处理,所以现在如果我的下游处理失败,该文件将永远丢失.我已经进行了重试,但我想要做的是将该文件标记为未处理的Redis,并在下一个投票周期中再次拾取它.

我发现RedisMetadataStore类上有一个remove方法,如果在处理过程中出现任何异常,它可以删除键,但想知道直接调用Remove方法是否明智?因为据我所知,这些方法应该由筛选器调用,而不是直接调用,但我找不到任何东西来处理这种情况.

如果文件在处理过程中失败,是否有任何构造可以从SftpPersistentAcceptOnceFileListFilter中删除该文件?

推荐答案

前面提到的SftpPersistentAcceptOnceFileListFilter是一个ResettableFileListFilter:

/**
 * A {@link FileListFilter} that can be reset by removing a specific file from its
 * state.
 * @param <F> The type that will be filtered.
 *
 * @author Gary Russell
 *
 * @since 4.1.7
 */
public interface ResettableFileListFilter<F> extends FileListFilter<F> {

因此,您确实可以将其作为顶级Bean,并在文件处理失败时调用它的remove().

该框架在几个地方做到了这一点,但实际上是在消息传递到目标通道之前:

private void resetFilterIfNecessary(AbstractFileInfo<F> file) {
    if (this.filter instanceof ResettableFileListFilter) {
        this.logger.info(
                LogMessage.format("Removing the remote file '%s' from the filter for a subsequent transfer attempt",
                        file.getFilename()));
        ((ResettableFileListFilter<F>) this.filter).remove(file.getFileInfo());
    }
}

您可以使用这FileInfo作为您下游处理的消息的FileHeaders.REMOTE_FILE_INFO标头.

Java相关问答推荐

无法运行Java(已解决)

在FML中删除关键帧动画

如何计算内循环的时间复杂度?

找到允许的最大底片

Java Stream,需要更新列表对象列表

如果一个子类没有构造函数,超类也没有构造函数,那么为什么我可以构造子类的实例呢?

无法处理批处理侦听器中的反序列化异常

无法初始化JPA实体管理器工厂:无法确定为Java类型<;类>;推荐的JdbcType

如何正确创建序列图?

我如何解释这个错误?必需类型:供应商R,提供:收集器对象,捕获?,java.util.List java.lang.Object>>

使用Class.this.field=Value初始化构造函数中的最后一个字段会产生错误,而使用this.field=Value则不会

如何在Spring Boot中创建可以将值传递给配置的&Enable&Quot;注释?

当构造函数创建一个新实例时,Java为什么需要&new";

Java 11 HttpCookie.parse在解析包含JSON的Cookie时引发IlLegalArgumentException

Spring Boot中的应用程序.properties文件中未使用的属性

如何处理两个几乎相同的XSD文件?

Java System.getProperty在哪里检索user.home?

当我将JTextField的getText函数与相等的String进行比较时;t返回true

如何使用带有可选参数的类生成器?

ExecutorService:如果我向Executor提交了太多任务,会发生什么?