Spring integration Spring集成:文件轮询内存消耗

Spring integration Spring集成:文件轮询内存消耗,spring-integration,poller,Spring Integration,Poller,我使用轮询器跟踪InboundChannelAdapter,每30秒处理一次文件。文件不是很大,但我意识到即使没有文件出现,内存消耗也会不断增加 @Bean @InboundChannelAdapter(value = "flowFileInChannel" ,poller = @Poller(fixedDelay ="30000", maxMessagesPerPoll = "1")) public MessageSource<File> flowInboundFileAdapte

我使用轮询器跟踪InboundChannelAdapter,每30秒处理一次文件。文件不是很大,但我意识到即使没有文件出现,内存消耗也会不断增加

@Bean
@InboundChannelAdapter(value = "flowFileInChannel" ,poller = @Poller(fixedDelay ="30000", maxMessagesPerPoll = "1"))
public MessageSource<File> flowInboundFileAdapter(@Value("${integration.path}") File directory) {
    FileReadingMessageSource source = new FileReadingMessageSource();
    source.setDirectory(directory);
    source.setFilter(flowPathFileFilter);
    source.setUseWatchService(true);
    source.setScanEachPoll(true);
    source.setAutoCreateDirectory(false);
    return source;
}
@Bean
@InboundChannelAdapter(value=“flowFileInChannel”,poller=@poller(fixedDelay=“30000”,maxMessagesPerPoll=“1”))
public MessageSource flowInboundFileAdapter(@Value(${integration.path}”)文件目录){
FileReadingMessageSource=新建FileReadingMessageSource();
source.setDirectory(目录);
source.setFilter(flowPathFileFilter);
source.setUseWatchService(true);
来源:setScanEachPoll(真);
source.setAutoCreateDirectory(false);
返回源;
}

是否存在每次轮询后未清除的内部队列?如何配置以避免占用内存

在深入挖掘之后,下面的Spring IntegrationFlows处理来自InboundChannelDapter的数据,它似乎在每次文件轮询后都占用了内存。在我注释了中间部分之后,内存消耗似乎是稳定的(而不是增加消耗)。现在我想知道我们如何强制Spring IntegrationFlows在通过不同通道(即下面最后一个通道)后清除这些消息和头文件

public IntegrationFlow incomingLocateFlow(){
返回IntegrationFlows.from(locateIncomingChannel())
//.split(“locateItemSplitter”、“split”)
//.transform(locateItemEnrichmentTransformer)
//.变换(locateRequestTransformer)
//.aggregate(新消费者(){//32
//
//@覆盖
//公共作废接受(AggregatorSpec AggregatorSpec){
//aggregatorSpec.processor(LocaterRequestProcessor,null);//33
//                    }
//
//},空)
//.变换(定位输入结果变压器)
//.transform(locateExceptionReportWritingHandler)
.channel(locateIncomingCompleteChannel())
.get();
}

确实有一个
AcceptOnceFileListFilter
代码如下:

private final Queue<F> seen;

private final Set<F> seenSet = new HashSet<F>();
看到私有最终队列;
私有最终集seenSet=newhashset();
每次轮询时,这些内部集合都会补充新文件

为此,您可以考虑使用<代码> FielSistMeExtEntRealTyCeFielistFixs与持久性<代码> Meta DATASTORE < /代码>实现以避免内存。

也考虑使用一些工具来分析内存内容。在

flowFileInChannel
的下游可能还有其他内容

更新

由于您使用的是
.aggregate()
,因此默认情况下肯定会消耗内存。这是因为有
SimpleMessageStore
来保存用于分组的消息。另外还有一个选项
expireGroupsUponCompletion(布尔)
,默认情况下该选项为
false
。因此,即使成功发布了一些信息,它们仍然在
消息存储中。这就是你的记忆不时被消耗的方式

默认情况下,该选项为
false
,以便在丢弃已完成组的延迟消息时具有逻辑。当它为
true
时,您可以为相同的
correlationKey
组成新组


请参阅中有关聚合器的更多信息。

确实有一个带有如下代码的
AcceptOnceFileListFilter

private final Queue<F> seen;

private final Set<F> seenSet = new HashSet<F>();
看到私有最终队列;
私有最终集seenSet=newhashset();
每次轮询时,这些内部集合都会补充新文件

为此,您可以考虑使用<代码> FielSistMeExtEntRealTyCeFielistFixs与持久性<代码> Meta DATASTORE < /代码>实现以避免内存。

也考虑使用一些工具来分析内存内容。在

flowFileInChannel
的下游可能还有其他内容

更新

由于您使用的是
.aggregate()
,因此默认情况下肯定会消耗内存。这是因为有
SimpleMessageStore
来保存用于分组的消息。另外还有一个选项
expireGroupsUponCompletion(布尔)
,默认情况下该选项为
false
。因此,即使成功发布了一些信息,它们仍然在
消息存储中。这就是你的记忆不时被消耗的方式

默认情况下,该选项为
false
,以便在丢弃已完成组的延迟消息时具有逻辑。当它为
true
时,您可以为相同的
correlationKey
组成新组


请参阅中有关聚合器的更多信息。

谢谢。经过一些调查,内存消耗增加的根本原因不是文件轮询部分,而是该部分之后的内容。我已经用更多信息更新了我的原始问题。请参阅我答案中的更新。谢谢Arterm,我做了更改,但似乎没有多大帮助。嗯。。。您能准确地说出哪个组件导致内存泄漏吗?如何使用VisualVM或YouKit等探查器来确定问题的根源?感谢Artem,经过一些调查,内存消耗增加的根本原因不是文件轮询部分,而是该部分之后的内容。我已经用更多信息更新了我的原始问题。请参阅我答案中的更新。谢谢Arterm,我做了更改,但似乎没有多大帮助。嗯。。。您能准确地说出哪个组件导致内存泄漏吗?如何使用VisualVM或YouKit这样的探查器来确定问题的根源?