带有手表服务和LastModifiedFilelistFilter的Spring Integration File -p



我想知道是否有人会知道我是否可以在fileinboundchanneladapter中使用手表服务以及LastModifiedFilelistFilter?

下面的示例代码为我提供了相当不一致的结果。有时,文件只是位于文件夹中而保持未经处理。

我怀疑手表服务可能与LastModified FilelistFilter不相容。例如

  • 如果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));
}

谢谢!

是的,这很好!

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

请,对此事提出一个JIRA,我们会想如何。

与此同时,作为解决方法,请勿将手表服务用于这种逻辑。

最新更新