为什么将ftp java dsl config引入Spring集成核心后,过滤器的行为会发生变化

时间:2018-10-16 07:35:12

标签: java spring spring-integration spring-integration-dsl

在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包装的filter(原始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引入内核集成时,过滤器方法changed to

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

这本身就可以,但是可以使用regexFilter became之类的方法:

    @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来处理我的持久元数据存储,现在已替换为FtpPersistentAcceptOnceFileListFilter来使用SimpleMetaDataStore。

因此,尽管现在代码在运行时可以正常编译,但它会收到重复的代码。

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

1 个答案:

答案 0 :(得分:1)

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

regexFilter()patternFilter()仍然在这里,以方便您配置简单的常见用例,而仅使用此过滤器而已。