使用MongoDB Metadatastore通过FileSystemPersistentAcceptOnceFileListFilter进行重复文件处理

问题描述 投票:0回答:1

我们在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"
}

但是,从服务器日志中可以看出,两个应用程序以几秒的间隔处理同一文件。

[[email protected] (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}]]


[[email protected] (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 Version ='1.5.4.RELEASE'构建应用程序

由于文件很少,我们没有看到重复的文件处理问题,但是,有几百(100,200)个文件我们看到重复的文件处理问题。

java spring-integration spring-integration-dsl
1个回答
0
投票

好吧,看起来你有一个问题,即在这些民意调查之间修改了文件。

FileSystemPersistentAcceptOnceFileListFilter以检查File.lastModified()的方式工作,如果旧值不同,则替换商店中的条目。

您可以考虑在LastModifiedFileListFilter之前在链中添加FileSystemPersistentAcceptOnceFileListFilter。所以,根据它的lastModified(),你不会轮询文件,直到它足够大。

© www.soinside.com 2019 - 2024. All rights reserved.