带有Watch Service和LastModifiedFileListFilter的Spring Integration File Poller

时间:2017-09-26 04:09:11

标签: java spring spring-integration

我想知道是否有人知道我是否可以在FileInboundChannelAdapter中使用watch服务以及LastModifiedFileListFilter?

下面的示例代码给出了相当不一致的结果。有时文件只是位于文件夹中并且仍未处理。

我怀疑监视服务可能与LastModifiedFileListFilter不兼容。对于例如

  • 如果LastModifiedFileListfilter设置为查找至少5个文件 秒旧,并且轮询器设置为每10秒轮询一次。
  • 在第9秒,可以在监视文件夹中创建一个文件。
  • 在10秒钟时,轮询器会查询监视服务以查找内容 在过去10秒内改变了。
  • 找到新创建的文件。

  • 新创建的最后修改时间为-1秒,所以它 不处理它。

  • 在20秒时,轮询者查询手表 第二次服务,这次它没有看到未经处理的 超过10秒前创建的文件。

还有其他人有这方面的经验吗?是否有建议的方法来解决此问题并允许我在继续之前验证文件是否已完整写入?

@Bean
public IntegrationFlow ftpInputFileWatcher()
{
    return IntegrationFlows.from(ftpInboundFolder(), filePoller())
            .handle()
            /*abbreviated*/
            .get();
}

private FileInboundChannelAdapterSpec ftpInboundFolder() {
     LastModifiedFileListFilter lastModifiedFileListFilter = new LastModifiedFileListFilter();
    lastModifiedFileListFilter.setAge(5);

    return Files.inboundAdapter(inboundFolder)
            .preventDuplicates(false)
            .useWatchService(true)
            .filter(fileAgeFilterToPreventPrematurePickup());
}

protected Consumer<SourcePollingChannelAdapterSpec> filePoller(){
    return poller -> poller.poller((Function<PollerFactory, PollerSpec>) p -> p.fixedRate(2000));
}

谢谢!

1 个答案:

答案 0 :(得分:1)

是的,那是好事!

对,他们不兼容。 WatchService是基于事件的,并将事件中的文件存储到内部队列中。当轮询器触发其操作时,它会轮询该队列中的文件并应用其过滤器。由于LastModifiedFileListFilter会丢弃该文件,并且不再有任何事件,因此我们不会再看到该文件。

请提出关于此事的JIRA,我们会考虑如何做到。

同时作为一种解决方法,不要将WatchService用于这种逻辑。