Spring-integration-file:使用监视服务= "true"和监视事件= "CREATE,DELETE"的入站通道适配器,删除事件管理得很好吗?



我使用spring-integration-file(最新版本4.3.4.RELEASE)来监视目录并获取关于CREATE和DELETE事件的消息。

这是我的Spring配置:

<int:channel id="canalFichiersFTP" />
<int-file:inbound-channel-adapter id="integrateurFichiersFTP" directory="#{gestionnaireChemins.cheminRepertoireEntrant}"
    use-watch-service="true" channel="canalFichiersFTP" auto-create-directory="false" watch-events="CREATE,DELETE">
    <int:poller id="pollerFichiersFTP" fixed-delay="${trt001.delai.verification.ftp}" />
</int-file:inbound-channel-adapter>
<int:service-activator input-channel="canalFichiersFTP" ref="trt001Scheduler" method="recevoirNouveauFichierFTP" />

我添加了use-watch-service="true"(如spring文档http://docs.spring.io/spring-integration/reference/html/files.html#watch-service-directory-scanner中所述)来使用FileReadingMessageSource。WatchServiceDirectoryScanner和watch-events="CREATE,DELETE"用于在目录中创建新文件时获取消息,以及在文件被删除并重新创建时获取消息。

但是它不起作用,当我在目录中创建文件时,我得到一条消息,但是当我删除文件并重新创建它时,我没有得到一条消息,如果我很好地理解了文档,我应该收到一条消息。

这个手表服务使用两个过滤器AcceptOnceFileListFilter和IgnoreHiddenFileListFilter聚集在一个CompositeFileListFilter中。在DELETE事件中,WatchServiceDirectoryScanner应该调用CompositeFileListFilter上的remove方法(这是一个ResettableFileListFilter,并将调用AcceptOnceFileListFilter上的remove方法),但它没有。

我认为问题是在第501行FileReadingMessageSource.java文件,我不明白为什么比较的实例是在FileReadingMessageSource.this.filter上完成的,而不是这个。过滤器,但也许我错过了什么?FileReadingMessageSource.this.filter在运行时为空,然后在过滤器上没有删除调用,我认为这就是为什么AcceptOnceFileListFilter不接收删除调用的原因,以及为什么当我删除文件并再次创建它时,我的代码不接收消息(AcceptOnceFileListFilter认为我已经收到了它)。

请帮助我,这是spring代码中的错误,我的配置错误还是我误解了spring文档中的某些内容?

非常感谢你的帮助

这是一个bug;通常两个过滤器引用是相同的,但是,正如您所说,在您的配置中,源过滤器为空。

我将打开一个JIRA问题;解决方法是显式设置ignore-hidden="true",解析器将正确添加过滤器。

JIRA。

最新更新