首页 > 解决方案 > Spring Integration 文件同步器:根据预定义的列表接受文件

问题描述

我正在通过 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;
    }

Constantes.EXTENSION 是一个接受 .csv 和 .CSV 的正则表达式。这工作正常。

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

标签: springspring-integrationfilteringspring-integration-sftp

解决方案


@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]

推荐阅读