Spring集成:FileInboundAdapter首先读取最旧的文件

时间:2018-04-17 14:36:47

标签: spring spring-integration spring-integration-dsl

我有以下FileInboundAdapter配置:

@Bean
public IntegrationFlow fileInboundAdapterFlow() {
    return IntegrationFlows.from(Files.inboundAdapter(new File("tmp"))
            .preventDuplicates(true),
            e -> e.id("fileInboundAdapterChannel").autoStartup(true)
                    .poller(Pollers.fixedDelay(1000, TimeUnit.MILLISECONDS)))
            .channel("fileInboundAdapterResultChannel").get();
}

目前,我们需要更改此设置以自行定制文件适配器,以便在SFTP适配器完成将文件下载到本地目录后手动启动它,此外我们需要首先读取最旧的文件因为文件名包含我们需要优先阅读文件的日期。

SFTP适配器配置如下:

@Bean
public IntegrationFlow sftpInboundFlow() {
    return IntegrationFlows
            .from(Sftp.inboundAdapter(this.sftpSessionFactory())
                            .preserveTimestamp(true)
                            .deleteRemoteFiles(true)
                            .remoteDirectory(this.remoteDirectory)
                            .regexFilter(".*\\.txt$")
                            .localDirectory(new File(this.localFilesDirectory)),
                    e -> e.id("sftpChannel")
                            .autoStartup(false)
                            .poller(Pollers.fixedDelay(5000, TimeUnit.MILLISECONDS)))
            .channel("sftpReplyChannel")
            .handle(m -> System.out.println(m.getPayload()))
            .get();
}

提前致谢。

1 个答案:

答案 0 :(得分:0)

不清楚为什么你需要为本地目录额外增加Files.inboundAdapter(),因为Sftp.inboundAdapter()不仅可以从SFTP下载文件,而且可以使用本地文件作为有效负载发出消息。因此,您.channel("sftpReplyChannel")将获得正确的数据。

无论如何,Files.inboundAdapter()可以配置Comparator<File>

/**
 * Create a {@link FileInboundChannelAdapterSpec} builder for the {@code FileReadingMessageSource}.
 * @param directory the directory to scan files.
 * @param receptionOrderComparator the {@link Comparator} for ordering file objects.
 * @return the {@link FileInboundChannelAdapterSpec} instance.
 */
public static FileInboundChannelAdapterSpec inboundAdapter(File directory,
        Comparator<File> receptionOrderComparator) {

通过这种方式,您可以按任何可能的方式订购本地文件。