在host1和host2上部署的spring集成应用程序的两个实例正在处理共享挂载点/ opt / tomcat / in上的传入文件 有时两个应用程序都在处理同一个文件,从而导致重复文件处理。
我们将ChainFileListFilter用作:
public ChainFileListFilter getFilters(String pattern){
ChainFileListFilter chainFileListFilter = new ChainFileListFilter();
chainFileListFilter.addFilter(new LastModifiedFileListFilter());
chainFileListFilter.addFilter(new SimplePatternFileListFilter("*.xml"));
chainFileListFilter.addFilter(new FileSystemPersistentAcceptOnceFileListFilter(mongoMetadataStore(), ""));
return chainFileListFilter;
}
从MongoDB集合中,我们看到该文件只有一个条目。
/* 1 */
{
"_id" : "/opt/tomcat/in/850/order_12345_2019-03-25_09-00-52.xml",
"value" : "1553522452000"
}
但是,从服务器日志中可以看到,两个应用程序都以几秒钟的间隔处理同一文件。
[user@host1.prod.env (prod) logs]$
server.log:2019-03-25 **09:30:14.943** INFO [task-scheduler-4] o.s.i.f.FileReadingMessageSource [FileReadingMessageSource.java:380] Created message: [GenericMessage [payload=/opt/tomcat/in/850/order_12345_2019-03-25_09-00-52.xml, headers={id=2dee86bb-701a-6f55-3e58-6ea3d78cdc30, timestamp=1553524214943}]]
[user@host2.prod.env (prod) logs]$
server.log:2019-03-25 **09:30:16.680** INFO [task-scheduler-4] o.s.i.f.FileReadingMessageSource [FileReadingMessageSource.java:380] Created message: [GenericMessage [payload=/opt/tomcat/in/850/order_12345_2019-03-25_09-00-52.xml, headers={id=3bc4b67c-a9d0-9f1a-667f-5aaa50c88a1a, timestamp=1553524216680}]]
应用程序使用Spring Boot版本='1.5.4.RELEASE'构建
文件很少,我们看不到重复文件处理问题,但是,几百(100,200)个文件中,我们看到了重复文件处理问题。
答案 0 :(得分:0)
好吧,看来您有一个问题是在两次轮询之间修改了文件。
FileSystemPersistentAcceptOnceFileListFilter
的工作方式是检查File.lastModified()
并在旧值不同的情况下替换存储中的条目。
您也可以考虑在LastModifiedFileListFilter
之前将FileSystemPersistentAcceptOnceFileListFilter
添加到链中。因此,只有在文件lastModified()
足够旧之前,您才对其进行轮询。