我已将集成流程从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));
}
答案 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$")
会被忽略。
这样做是为了避免与意外的内部构图混淆。例如,regex
和pattern
过滤器与FtpPersistentAcceptOnceFileListFilter
:https://docs.spring.io/spring-integration/docs/5.0.0.RC1/reference/html/whats-new.html#__s_ftp_changes一起组成:
默认情况下,所有入站通道适配器(基于流和基于同步)都使用适当的
AbstractPersistentAcceptOnceFileListFilter
实现来防止远程文件重复下载。
换句话说:任何基于过滤器的选项都是互斥的,最后一个选项获胜。这是更容易支持的选择,让最终用户不必担心意外的突变。
要修复您的要求,您必须对CompositeFileListFilter
和ftpPersistantFilter
使用FtpRegexPatternFileListFilter
。
我认为我们必须在此问题上添加一些Migration Guide子弹。 谢谢你的理解。