运行ActiveMQ 5.4.0。我有一组用户通过一个共同的ActiveMQ JMS提供程序相互订阅和发布各种主题。经过一段时间的活动后,ActiveMQ控制台开始显示
INFO|USAGE MANAGER memory limit reached. Stopping producer (ID ...... to prevent flooding topic .....
对于各种主题,此消息会重复出现。我知道在某些情况下,某些消息永远不会传递。 'net'上的所有生产者都没有实施任何类型的流量控制。他们只是发送和忘记。显然,一些制片人被封锁,但大多数最终都会被打破。我认为主题是非持久性/非持久性的。
我只是使用默认的activemq配置。那么,如何最好地解决这个问题呢?是否明智地禁用流量控制以及如何实现?
答案 0 :(得分:3)
如果您使用默认的ActiveMQ配置,则启用流量控制。这就是你收到这些消息的原因。
如果您不想使用流量控制,可以执行以下操作:
<policyEntry topic="myTopic" producerFlowControl="false">
这将使用尽可能多的ActiveMQ给你的内存。但请注意,在某些时候,如果ActiveMQ认为您可能会导致其他队列出现问题等,它将开始在磁盘上假脱机 - 这会影响性能,因为它会影响磁盘。 这与持久性完全分开。但是,如果您在启动时为总数据需求设置了合理的堆限制,那么您应该没问题。
请注意,如果您想告诉它不要通过磁盘,您必须使用流量控制,并且必须设置最大内存大小,例如:
<policyEntry topic="myTopic" producerFlowControl="true" memoryLimit="200mb">
<pendingQueuePolicy>
<vmQueueCursor/>
</pendingQueuePolicy>
</policyEntry>
这不会使用磁盘,并在命中memoryLimit时阻止生成器。同样,您应该能够定制它,以便它适用于您的配置。
有关流量控制的更多信息:http://activemq.apache.org/producer-flow-control.html