我使用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 =&#34; true&#34; (如Spring doc http://docs.spring.io/spring-integration/reference/html/files.html#watch-service-directory-scanner中所述)使用FileReadingMessageSource.WatchServiceDirectoryScanner和watch-events =&#34; CREATE,DELETE&#34;在目录中创建新文件时获取消息,并在删除并再次创建文件时获取消息。
但它确实有效,当我在目录中创建一个文件时,我收到一条消息,但当我删除该文件并再次创建它时,如果我很好理解,我就不会收到消息doc我应该收到一个。
此监视服务使用两个过滤器AcceptOnceFileListFilter和IgnoreHiddenFileListFilter收集在一个CompositeFileListFilter中。在DELETE事件上,WatchServiceDirectoryScanner应该调用CompositeFileListFilter上的remove方法(这是一个ResettableFileListFilter,并将在AcceptOnceFileListFilter上调用remove方法),但它没有。
我认为问题出在FileReadingMessageSource.java文件的第501行,我不明白为什么比较的实例是在FileReadingMessageSource.this.filter而不是this.filter上完成的,但也许我想念一些东西? FileReadingMessageSource.this.filter在运行时为null,然后没有对过滤器进行删除调用,我认为这就是为什么AcceptOnceFileListFilter没有收到删除调用的原因以及为什么当我删除文件并创建我的代码再次收到消息(AcceptOnceFileListFilter认为我已经收到了消息)。
请帮助我,是春天代码中的错误,我的配置中的错误还是我误解了春季文档中的内容?
很多你的帮助。
答案 0 :(得分:0)
这是一个错误;通常两个过滤器引用是相同的,但正如您所说,使用您的配置,源过滤器为空。
我将开启一个JIRA问题;解决方法是显式设置ignore-hidden="true"
,解析器将正确添加过滤器。