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

Spring integration: FileInboundAdapter to read oldest files first

我有以下 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();
}

提前致谢。

不清楚为什么本地目录需要额外的 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) {

这样您就可以真正地以任何可能和需要的方式订购本地文件。