java - 为什么当 ftp java dsl 配置被引入 spring 集成核心时过滤器行为发生了变化

标签 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。这非常有效。

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

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 现在被采用 SimpleMetaDataStore 的 FtpPersistentAcceptOnceFileListFilter 所取代。

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

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

最佳答案

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

regexFilter()patternFilter()当您只有这个过滤器而没有其他任何东西时,仍然在这里方便地配置简单的常见用例。

关于java - 为什么当 ftp java dsl 配置被引入 spring 集成核心时过滤器行为发生了变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52830192/

相关文章:

java - HikariPool-1 - 连接不可用,对于非常小的负载服务器,请求在 30000 毫秒后超时

java - 不同的返回类型

java - 正确使用 Facelet 模板和复合组件

junit - 使用 TestNG 进行 Spring 依赖注入(inject)

java - Spring Integration 2.2.3.RELEASE @ServiceActivator 未调用

junit - SFTP 连接的 Spring junit 测试 : com. jcraft.jsch.JSchException: Packet corrupt

java - 为什么PowerShell会显示 'Cannot find symbol'错误,但是VS Code Java Process Console可以很好地运行它?

xml - Eclipse Spring STS "Config Set"有什么用?

java - 如何在 Spring Batch 中使用 HibernateCursorItemReader

spring-integration - requestMessage 中的负载正在使用出站网关请求中的响应对象进行修改