【问题标题】:Order in which filters are applied to Inbound ftp adapters in spring integration在 Spring 集成中将过滤器应用于入站 ftp 适配器的顺序
【发布时间】:2017-05-17 15:33:54
【问题描述】:

我正在使用 spring 集成入站通道适配器,如下所示

inboundAdapter(csf).preserveTimestamp(true)//
              .remoteDirectory(feed.getRemoteDirectory())//
              .regexFilter(feed.getRegexFilter())// regex expression
              .filter(ftpRemoteFileFilter)// remote filter
              .deleteRemoteFiles(feed.getDeleteRemoteF

所以我使用了远程过滤器和开箱即用的正则表达式过滤器。我想知道应用正则表达式过滤器和远程过滤器的顺序是什么。从最初的分析看起来像正则表达式过滤器是第一位的,有人可以告诉我这个决定是在哪里做出的,这样我就可以确定了。

如果无法知道唯一的其他选择是使用 CompositeFileListFilter.

【问题讨论】:

    标签: ftp spring-integration spring-integration-sftp


    【解决方案1】:

    您要查找的代码位于 FtpInboundChannelAdapterSpec 中,如下所示:

    @Override
    public FtpInboundChannelAdapterSpec regexFilter(String regex) {
        return filter(composeFilters(new FtpRegexPatternFileListFilter(regex)));
    }
    
    @SuppressWarnings("unchecked")
    private CompositeFileListFilter<FTPFile> composeFilters(FileListFilter<FTPFile> fileListFilter) {
        CompositeFileListFilter<FTPFile> compositeFileListFilter = new CompositeFileListFilter<>();
        compositeFileListFilter.addFilters(fileListFilter,
                new FtpPersistentAcceptOnceFileListFilter(new SimpleMetadataStore(), "ftpMessageSource"));
        return compositeFileListFilter;
    }
    

    所以,正如您在声明 regexFilter 时看到的那样,它与 FtpPersistentAcceptOnceFileListFilter 一起组成了 CompositeFileListFilter,其中 regexFilter 绝对是第一个。首先是因为FtpPersistentAcceptOnceFileListFilter持久性,这对于存储之后可能与正则表达式不匹配的文件并不好。

    如果你需要一些更复杂的逻辑,你真的应该去CompositeFileListFilter 方式并且只通过filter() 选项注入它。我的意思是你必须将你的regexpFilter 合并到CompositeFileListFilter 而不是regexFilter()

    注意:在 5.0 中将 Java DSL 移入 Core 后,.filter() 选项如下所示:

    public S filter(FileListFilter<F> filter) {
        this.synchronizer.setFilter(filter);
        return _this();
    }
    

    它会覆盖任何以前提供的过滤器,包括regexp。这样做是为了避免混淆 .filter() 链,而支持外部配置的 CompositeFileListFilterChainFileListFilter

    【讨论】:

    • ok 听起来不错,所以更好的选择是放弃 regexFilter 并使用 CompositeFileListFilter 过滤器作为未来的证明。
    • 这正是我所说的。如果答案满足您的期望,请考虑stackoverflow.com/help/someone-answers
    猜你喜欢
    • 2014-12-07
    • 1970-01-01
    • 1970-01-01
    • 2015-03-21
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 2015-07-11
    相关资源
    最近更新 更多