FTP IntegrationFlows过滤器在Spring Integration 5.0.0.RC1中不起作用

时间:2017-11-06 15:45:26

标签: spring-integration

我已将集成流程从4.3.12升级到5.0.0.RC1,以利用入站流功能。我发现patternFilter和regexFilter都没有过滤。为了检查它不仅仅是流媒体界面,我尝试使用基于文件的界面,我看到了相同的结果。

在4.3.12中,我的基于文件的流程定义为:

return IntegrationFlows
    .from(s -> s.ftp(ftpSessionFactory())
        .preserveTimestamp(true)
        .remoteDirectoryExpression(remoteDirectory())
        .regexFilter("sn\\.[0-9]{4}\\.txt$")
        .filter(ftpPersistantFilter())
        .localFilter(fileSystemPersistantFilter())
        .localFilename(f -> (currentUtcDay.toString("YYYYMMdd")) + "." + f)
        .localDirectory(new File(this.localDirectory)),
        e -> e.id("ftpInboundAdapter").autoStartup(true))
    .channel(MessageChannels.queue("ftpInboundResultChannel"))
    .get();

为了保持一致性,这里的定义与5.0.0.RC1中的相同:

return IntegrationFlows
    .from(Ftp.inboundAdapter(ftpSessionFactory())
        .preserveTimestamp(true)
        .remoteDirectoryExpression(remoteDirectory())
        .regexFilter("sn\\.[0-9]{4}\\.txt$")
        .filter(ftpPersistantFilter())
        .localFilter(fileSystemPersistantFilter())
        .localFilename(f -> (currentUtcDay.toString("YYYYMMdd")) + "." + f)
        .localDirectory(new File(this.localDirectory)),
        e -> e.id("ftpInboundAdapter").poller(Pollers.fixedDelay(100)))
    .channel(MessageChannels.queue("ftpInboundResultChannel"))
    .get();

5.0.0.RC1中根本没有过滤。过滤器的配置是否已更改?还有什么我需要做的吗?

编辑: 对于遇到这个的下一个人来说,这是修复。

return IntegrationFlows
    .from(Ftp.inboundAdapter(ftpSessionFactory())
        .preserveTimestamp(true)
        .remoteDirectoryExpression(remoteDirectory())
        .filter(ftpPersistantFilter())
        .localFilter(fileSystemPersistantFilter())
        .localFilename(f -> (currentUtcDay.toString("YYYYMMdd")) + "." + f)
        .localDirectory(new File(this.localDirectory)),
        e -> e.id("ftpInboundAdapter").poller(Pollers.fixedDelay(100)))
    .channel(MessageChannels.queue("ftpInboundResultChannel"))
    .get();

然后我改变了我的ftpPersistantFilter:

@Bean
public FtpPersistentAcceptOnceFileListFilter ftpPersistantFilter() {
    return new FtpPersistentAcceptOnceFileListFilter(metadataStore(), "ftpPersistentAcceptOnce");
}

为:

@Bean
public CompositeFileListFilter ftpPersistantFilter() {
    CompositeFileListFilter filters = new CompositeFileListFilter();
    filters.addFilter(new FtpPersistentAcceptOnceFileListFilter(metadataStore(), "ftpPersistentAcceptOnce"));
    filters.addFilter(new FtpRegexPatternFileListFilter(regexFilter));
}

1 个答案:

答案 0 :(得分:1)

Spring Integration 5.0的更改类似于.filter(ftpPersistantFilter())完全覆盖以前的过滤器感知选项:

/**
 * Configure a {@link FileListFilter} to be applied to the remote files before
 * copying them.
 * @param filter the filter.
 * @return the spec.
 */
public S filter(FileListFilter<F> filter) {
    this.synchronizer.setFilter(filter);
    return _this();
}

因此,您的.regexFilter("sn\\.[0-9]{4}\\.txt$")会被忽略。

这样做是为了避免与意外的内部构图混淆。例如,regexpattern过滤器与FtpPersistentAcceptOnceFileListFilterhttps://docs.spring.io/spring-integration/docs/5.0.0.RC1/reference/html/whats-new.html#__s_ftp_changes一起组成:

  

默认情况下,所有入站通道适配器(基于流和基于同步)都使用适当的AbstractPersistentAcceptOnceFileListFilter实现来防止远程文件重复下载。

换句话说:任何基于过滤器的选项都是互斥的,最后一个选项获胜。这是更容易支持的选择,让最终用户不必担心意外的突变。

要修复您的要求,您必须对CompositeFileListFilterftpPersistantFilter使用FtpRegexPatternFileListFilter

我认为我们必须在此问题上添加一些Migration Guide子弹。 谢谢你的理解。