Spring integration Spring集成:文件轮询内存消耗
我使用轮询器跟踪InboundChannelAdapter,每30秒处理一次文件。文件不是很大,但我意识到即使没有文件出现,内存消耗也会不断增加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
@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这样的探查器来确定问题的根源?