1

在 Spring Integration 4 中,我使用 spring integration java dsl 项目编写了这样的代码:

      FtpInboundChannelAdapterSpec ftpAdapterSpec = Ftp.inboundAdapter(ftpSessionFactory)
                .preserveTimestamp(true)
                .remoteDirectory(remoteFolder)
                .filter(new FtpPersistentAcceptOnceFileListFilter(metaDataStore, "ftp-inbound-" + id + ":"))
                .regexFilter(".*")                
                .localDirectory(Paths.get(System.getProperty("java.io.tmpdir"), "ftp-inbound", localPath).toFile()).autoCreateLocalDirectory(true)
                .deleteRemoteFiles(false);

注意它是如何包含一个正则表达式过滤器和一个 FtpPersistentAcceptOnceFilterListFilter 的。这很好用。

regexFilter 包装的过滤器(原始 java dsl 项目)的代码是:

public S filter(FileListFilter<F> filter) {
    if (this.filter == null) {
        if (filter instanceof CompositeFileListFilter) {
            this.filter = (CompositeFileListFilter<F>) filter;
        }
        else {
            this.filter = new CompositeFileListFilter<F>();
            this.filter.addFilter(filter);
        }
        this.synchronizer.setFilter(this.filter);
    }
    else {
        this.filter.addFilter(filter);
    }
    return _this();
}

如您所见,它从传入的过滤器构建了一个复合过滤器(并在您传入更多时堆叠)。

但是,当将 java dsl 引入核心集成时,过滤器方法更改为

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

这本身很好,但是像 regexFilter 这样的方法变成了:

    @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;
    }

所以现在我没有的代码做了我想要的,因为采用我的持久元数据存储的 FtpPersistentAcceptOnceFileListFilter 现在被采用 SimpleMetaDataStore 的 FtpPersistentAcceptOnceFileListFilter 替换。

所以现在虽然代码在运行时编译得很好,但它会收到重复项。

所以问题是它为什么会改变,是否有充分的理由改变它?因为就目前而言,由于 regexFilter 方法的不明显副作用,它变得相当不可用。

4

1 回答 1

1

它已更改filter(FileListFilter<F> filter)为优先于所有其他过滤选项的方式,就像使用 XML 配置一样,以保持一致性。这种行为的原因仅仅是因为我们不知道您想要组成这些过滤器的顺序。因此,为了确保正确的顺序,您需要自己构建一个CompositeFileListFilter,包括一个 required FtpRegexPatternFileListFilter,并将其注入到这个fitler()选项中。

和仍然在这里是为了方便配置简单的常见用例,当您只有这个过滤器时regexFilter()patternFilter()仅此而已。

于 2018-10-16T13:49:23.903 回答