我已经设置了带有任务执行器的文件轮询器
ExecutorService executorService = Executors.newFixedThreadPool(10);
LOG.info("Setting up the poller for directory {} ", finalDirectory);
StandardIntegrationFlow standardIntegrationFlow = IntegrationFlows.from(new CustomFileReadingSource(finalDirectory),
c -> c.poller(Pollers.fixedDelay(5, TimeUnit.SECONDS, 5)
.taskExecutor(executorService)
.maxMessagesPerPoll(10)
.advice(new LoggerSourceAdvisor(finalDirectory))
))
//move file to processing first processing
.transform(new FileMoveTransformer("C:/processing", true))
.channel("fileRouter")
.get();
我正在使用基于lastUpdated的AcceptOnceFilter。
一切正常,我遇到的问题是我轮询文件的目录来自外部系统。该文件仍在复制中,应用程序提取并处理了部分数据。
在处理之前,如何确保文件已完全写入。
我无法更改外部系统,因为它们只是将文件复制到文件夹中。他们不会更改他们的系统。
答案 0 :(得分:1)
请先将AcceptOnceFileListFilter
与LastModifiedFileListFilter
结合使用,以使这些文件在开始阅读之前可以在目录中保留一段时间。因此,在您拿起它们之前,它们可能会被完整写出。
有关更多信息,请参阅文档:https://docs.spring.io/spring-integration/reference/html/files.html#file-reading
答案 1 :(得分:1)
我无法更改外部系统
在处理之前,如何确保文件已完全写入。
您不能(可靠地)。
我们提供LastModifiedFileListFilter
;您也可以监视文件大小,但是无论哪种方式,这都是一种脆弱的技术,因为网络故障可能会导致文件传输暂停。另外,在复制文件时取决于操作系统(和远程访问机制)来更新这些属性,这种情况可能并非总是如此。