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) {
这样您就可以真正地以任何可能和需要的方式订购本地文件。
我有以下 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) {
这样您就可以真正地以任何可能和需要的方式订购本地文件。