我想知道是否有人会知道我是否可以在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,我们会想如何。
与此同时,作为解决方法,请勿将手表服务用于这种逻辑。