我有一个集成流程,该流程从称为“促销”的消息通道读取文件,然后将其拆分并转换为每个文件的特定行,然后由ouboundAdapter在追加模式下逐行写入到称为“生成”的目录。 然后,我有一个入站适配器,该适配器以固定的延迟从轮询器的“生成的”目录中读取文件,并将文件移动到目标位置,以供其他应用程序选择。如何确保从第二个流程中挑选的文件是完整的?我看到的情况是入站适配器移动到仍由第一流写入的目标文件。可以将锁添加到正在写入“已生成”目录的文件中,以便进行第二个流程吗?
private IntegrationFlow promoChannelSubscriber(File generatedDir, GenericSelector storesFilter) {
return IntegrationFlows
.from("promo")
.filter(storesFilter)
.split(
Files.splitter()
.applySequence(true)
)
.transform(this::enrichXstoreFileHeader)
.handle(
Files.outboundAdapter(generatedDir)
.autoCreateDirectory(true)
.fileExistsMode(APPEND)
.appendNewLine(true)
)
.get();
}
private IntegrationFlow movePromotions(File generatedDir, Path destinationDirectory) {
return IntegrationFlows.from(
Files.inboundAdapter(generatedDir, comparingLong(File::lastModified))
.regexFilter(fileNamePattern),
cas -> cas.poller(
Pollers.fixedDelay(2, TimeUnit.SECONDS)
.maxMessagesPerPoll(promoConfig.getMaxMessagesPerPoll())
.errorChannel(errorChannelName)
))
.handle(
Files.outboundAdapter(destinationDirectory.toFile())
.deleteSourceFiles(true)
.temporaryFileSuffix(".tmp")
)
.get();
}
谢谢
答案 0 :(得分:0)
为什么要使用2个流?为什么在收到最后一个拆分时不执行第二个流程?
如果必须使用2个流,则需要写入一个与第二个流的过滤器不匹配的临时文件名。
然后,在文件完成后,将文件重命名为其最终名称。
您可以使用标记消息和路由器来检测文件结束情况。
有关示例,请参见file-split-ftp sample application。