我想知道是否有人知道我是否可以在FileInboundChannelAdapter中使用watch服务以及LastModifiedFileListFilter?
下面的示例代码给出了相当不一致的结果。有时文件只是位于文件夹中并且仍未处理。
我怀疑监视服务可能与LastModifiedFileListFilter不兼容。对于例如
找到新创建的文件。
新创建的最后修改时间为-1秒,所以它 不处理它。
还有其他人有这方面的经验吗?是否有建议的方法来解决此问题并允许我在继续之前验证文件是否已完整写入?
@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));
}
谢谢!
答案 0 :(得分:1)
是的,那是好事!
对,他们不兼容。 WatchService是基于事件的,并将事件中的文件存储到内部队列中。当轮询器触发其操作时,它会轮询该队列中的文件并应用其过滤器。由于LastModifiedFileListFilter
会丢弃该文件,并且不再有任何事件,因此我们不会再看到该文件。
请提出关于此事的JIRA,我们会考虑如何做到。
同时作为一种解决方法,不要将WatchService用于这种逻辑。