我正在使用 ActiveMQ ,并且在等待消费者时,有关于持久消息如何以及何时真正被交换到磁盘的问题?
我正在使用虚拟主题,并创建队列使用者以接收来自他们的消息。所有邮件都持久(我已经验证了所有非消费邮件的记录确实存在于持久性存储中)
我有多个消费者经常上下班。将 jconsole 连接到activemq后,我注意到所有未消耗的消息似乎包含在代理的内存中。它们不会被交换到磁盘,至少我无法验证。
设置memoryUsage
或启用producerFlowControl
- 没有任何效果。如果在启用流量控制时命中memoryUsage限制,则代理是否被阻止,或者如果流控制关闭则MemoryPercentUsage持续增加。
当activemq确实通过将消息存储到磁盘/持久性存储来释放内存?或者是这样吗?我如何验证它是磁盘空间而不是RAM,当队列中有数百万条未消耗(待处理)消息时,它会长期限制代理?
答案 0 :(得分:0)
请重新检查memoryUsage on,您可以指定不同的限制消息应该保留。在下面的示例中,当64 MB的内存已满时,它开始写入磁盘,最大为100 GB。
<systemUsage>
<systemUsage>
<memoryUsage>
<memoryUsage limit="64 mb" />
</memoryUsage>
<storeUsage>
<storeUsage limit="100 gb" />
</storeUsage>
</systemUsage>
</systemUsage>
答案 1 :(得分:0)
尝试使用storeCursor并在destinationPolicy中设置内存限制,这将强制每个队列限制它将从磁盘中提取的内存/消息量...
<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntry queue=">" producerFlowControl="false" memoryLimit="100mb">
<pendingQueuePolicy>
<storeCursor/>
</pendingQueuePolicy>
</policyEntry>
</policyEntries>
</policyMap>
</destinationPolicy>