Spring集成文件同步器:基于预定义列表接受文件

Spring集成文件同步器:基于预定义列表接受文件,spring,spring-integration,filtering,spring-integration-sftp,Spring,Spring Integration,Filtering,Spring Integration Sftp,我正在通过Sftp将文件从远程传输到本地进行处理。 我只想传输.csv文件,我有一个预定义文件名列表 我找不到允许指定多个模式的FileListFilter,如果至少有一个模式匹配,则可以进行传输 到目前为止,我已经有了这段代码,这是对“.csv”过滤的追求 整合流程 @Bean public IntegrationFlow integFlow() { return IntegrationFlows .from(ftpMessageSource()

我正在通过Sftp将文件从远程传输到本地进行处理。 我只想传输.csv文件,我有一个预定义文件名列表

我找不到允许指定多个模式的FileListFilter,如果至少有一个模式匹配,则可以进行传输

到目前为止,我已经有了这段代码,这是对“.csv”过滤的追求

整合流程

@Bean
    public IntegrationFlow integFlow() {
        return IntegrationFlows
            .from(ftpMessageSource(), c -> poller())
            ... more processing
消息源

public MessageSource<File> ftpMessageSource() {

            SftpInboundFileSynchronizer fileSynchronizer = new SftpInboundFileSynchronizer(sessionFactory);
            fileSynchronizer.setRemoteDirectory(remoteDirectory);
            fileSynchronizer.setDeleteRemoteFiles(true);
            fileSynchronizer.setFilter(new SftpRegexPatternFileListFilter(Constantes.EXTENSION));
            SftpInboundFileSynchronizingMessageSource ftpInboundFileSync = 
                new SftpInboundFileSynchronizingMessageSource(fileSynchronizer);

            ftpInboundFileSync.setLocalDirectory(new File(workDirectory));
            ftpInboundFileSync.setAutoCreateLocalDirectory(true);
            CompositeFileListFilter<File> compositeFileListFilter = new CompositeFileListFilter<>();
            compositeFileListFilter.addFilter(new RegexPatternFileListFilter(Constantes.EXTENSION));
            ftpInboundFileSync.setLocalFilter(compositeFileListFilter);
            return ftpInboundFileSync;
    }
public MessageSource ftpMessageSource(){
SftpInboundFileSynchronizer fileSynchronizer=新的SftpInboundFileSynchronizer(sessionFactory);
fileSynchronizer.setRemoteDirectory(remoteDirectory);
fileSynchronizer.setDeleteRemoteFiles(true);
setFilter(新的sft文件列表过滤器(constants.EXTENSION));
SftpInboundFileSynchronizingMessageSource ftpInboundFileSync=
新的SftpInboundFileSynchronizingMessageSource(文件同步器);
ftpInboundFileSync.setLocalDirectory(新文件(workDirectory));
ftpInboundFileSync.setAutoCreateLocalDirectory(true);
CompositeFileListFilter CompositeFileListFilter=新的CompositeFileListFilter();
addFilter(新的regexpaterFileListFilter(constants.EXTENSION));
ftpInboundFileSync.setLocalFilter(compositeFileListFilter);
返回ftpInboundFileSync;
}
constants.EXTENSION是接受.csv和.csv的正则表达式。这个很好用


假设我有一个包含“string1”、“string2”、“string3”的字符串列表,我想传输格式为string1*、string2*或string3*的每个文件。我将如何继续?

有一个
CompositeFileListFilter

* Simple {@link FileListFilter} that predicates its matches against <b>all</b> of the
* configured {@link FileListFilter}.
因此,您可以将此
CompositeFileListFilter
配置为多个
SFTPREGTerFileListFilter
代理,并且只要这些代理在
CompositeFileListFilter
中至少包含一个筛选器,您的文件就会被处理


查看文档中有关筛选器的更多信息:

一个解决方案是设置一个不正确的正则表达式来检查我的每一个文件名?从今天起,此列表中有7项,将来不会有太大变化。但我宁愿避免这样做,因为它看起来与我需要的完全相同,并且使用基本FileListFilter进行简单的实现。我将尝试此方法明天上班,并相应更新
public boolean accept(F file) {
    AtomicBoolean allAccept = new AtomicBoolean(true);
    // we can't use stream().allMatch() because we have to call all filters for this filter's contract
    this.fileFilters.forEach(f -> allAccept.compareAndSet(true, f.accept(file)));
    return allAccept.get();
}
@SpringBootApplication
public class So59161698Application {

    public static void main(String[] args) {
        SpringApplication.run(So59161698Application.class, args);
    }

    private final String myPatterns = "foo,bar,baz";

    @Bean
    public FileListFilter<File> filter() {
        Set<String> patterns = StringUtils.commaDelimitedListToSet(this.myPatterns);
        return files -> Arrays.stream(files)
                .filter(file -> patterns.stream()
                        .filter(pattern -> file.getName().startsWith(pattern))
                        .findFirst()
                        .isPresent())
                .collect(Collectors.toList());
    }

    @Bean
    public ApplicationRunner runner(FileListFilter<File> filter) {
        return args -> {
            System.out.println(filter.filterFiles(new File[] {
                    new File("foo.csv"),
                    new File("bar.csv"),
                    new File("baz.csv"),
                    new File("qux.csv")
            }));
        };
    }

}
[foo.csv, bar.csv, baz.csv]