无法在 file:inbound-channel-adapter 和扫描仪中设置不同的过滤器?

can't set a different filter in file:inbound-channel-adapter and scanner?

以下是我的 Spring 集成配置的一部分:

<bean id="recursiveScanner" class="org.springframework.integration.file.RecursiveLeafOnlyDirectoryScanner" >
    <property name="filter" ref="skipTmpFileFilter" />
</bean>

<bean id="skipTmpFileFilter" class="org.springframework.integration.file.filters.RegexPatternFileListFilter">
    <constructor-arg value="^[^~].*"/>
</bean>

<file:inbound-channel-adapter directory="${inbound.folder}"
                              scanner="recursiveScanner" 
                              id="fileChannel" 
                              filter="fileNameFilter">
    <integration:poller id="poller" fixed-delay="10000" />
</file:inbound-channel-adapter>

如您所见,我想定义 2 个不同的过滤器:

我在调试模式下启动它时看到的是,首先,skipTmpFileFilter 在 recursiveScanner 中设置,但稍后它被 fileNameFilter 覆盖,使 skipTmpFileFilter 无效。

这是预期的行为还是错误?我认为能够配置 2 种不同的过滤器是有意义的,一种是通用的(在扫描仪中),另一种是更具体的(在入站适配器中)。在这里,我有点被迫使用复合过滤器。

谢谢

文森特

如果我们看一下 FileReadingMessageSource 的源代码,我们会看到:

public void setFilter(FileListFilter<File> filter) {
    Assert.notNull(filter, "'filter' must not be null");
    this.scanner.setFilter(filter);
}

并且 filter 周围没有更多关于 FileReadingMessageSource 的内容。一切都委托给 DirectoryScanner.

所以,没有任何选择,除非只提供一个 filter 选项:或者对于 DirectoryScanner bean,或者 <file:inbound-channel-adapter>.

是的:要设置多个过滤器,您应该使用 CompositeFileListFilter

不过我认为我们可以保护 override 案例的那一点。

随时提出 JIRA 问题。