ActiveMq,未使用的消息总是在代理的内存中?

时间:2011-08-10 18:37:59

标签: activemq

我正在使用 ActiveMQ ,并且在等待消费者时,有关于持久消息如何以及何时真正被交换到磁盘的问题?

我正在使用虚拟主题,并创建队列使用者以接收来自他们的消息。所有邮件都持久(我已经验证了所有非消费邮件的记录确实存在于持久性存储中)

我有多个消费者经常上下班。将 jconsole 连接到activemq后,我注意到所有未消耗的消息似乎包含在代理的内存中。它们不会被交换到磁盘,至少我无法验证。 设置memoryUsage或启用producerFlowControl - 没有任何效果。如果在启用流量控制时命中memoryUsage限制,则代理是否被阻止,或者如果流控制关闭则MemoryPercentUsage持续增加。

当activemq确实通过将消息存储到磁盘/持久性存储来释放内存?或者是这样吗?我如何验证它是磁盘空间而不是RAM,当队列中有数百万条未消耗(待处理)消息时,它会长期限制代理?

2 个答案:

答案 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>