SpringIntegration Poller复制文件

时间:2018-12-15 14:41:56

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

我已经设置了带有任务执行器的文件轮询器

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。

一切正常,我遇到的问题是我轮询文件的目录来自外部系统。该文件仍在复制中,应用程序提取并处理了部分数据。

在处理之前,如何确保文件已完全写入。

我无法更改外部系统,因为它们只是将文件复制到文件夹中。他们不会更改他们的系统。

2 个答案:

答案 0 :(得分:1)

请先将AcceptOnceFileListFilterLastModifiedFileListFilter结合使用,以使这些文件在开始阅读之前可以在目录中保留一段时间。因此,在您拿起它们之前,它们可能会被完整写出。

有关更多信息,请参阅文档:https://docs.spring.io/spring-integration/reference/html/files.html#file-reading

答案 1 :(得分:1)

  

我无法更改外部系统

     

在处理之前,如何确保文件已完全写入。

您不能(可靠地)。

我们提供LastModifiedFileListFilter;您也可以监视文件大小,但是无论哪种方式,这都是一种脆弱的技术,因为网络故障可能会导致文件传输暂停。另外,在复制文件时取决于操作系统(和远程访问机制)来更新这些属性,这种情况可能并非总是如此。