我正在调查代理网络中的内存问题。 根据JConsole,当代理开始阻止消息时,ActiveMQ.Advisory.TempQueue占用了99%的已配置内存。
有关配置的一些详细信息
大部分默认配置。一个打开的stomp + nio连接器,一个打开的openwire连接器。所有代理都形成一个超立方体(一个与其他代理的一个路上连接(更容易自动生成))。没有流量控制。
问题详情
webconsole在30个消费者(6个代理商,一个消费者,其余是使用java连接器的客户端)中显示1974234排队和45345个出列消息。据我所知,出队数量不应小于:入队*消费者。所以在我的情况下,大量的建议没有消耗,并开始填补我的临时消息空间。 (目前我将几个gb配置为临时空间)
由于没有客户主动使用临时队列,我觉得这很奇怪。看了一下临时队列后我更加困惑了。大多数消息看起来像这样(msg.toString):
ActiveMQMessage {commandId = 0, responseRequired = false, messageId = ID:srv007210-36808-1318839718378-1:1:0:0:203650, originalDestination = null, originalTransactionId = null, producerId = ID:srv007210-36808-1318839718378-1:1:0:0, destination = topic://ActiveMQ.Advisory.TempQueue, transactionId = null, expiration = 0, timestamp = 0, arrival = 0, brokerInTime = 1318840153501, brokerOutTime = 1318840153501, correlationId = null, replyTo = null, persistent = false, type = Advisory, priority = 0, groupID = null, groupSequence = 0, targetConsumerId = null, compressed = false, userID = null, content = null, marshalledProperties = org.apache.activemq.util.ByteSequence@45290155, dataStructure = DestinationInfo {commandId = 0, responseRequired = false, connectionId = ID:srv007210-36808-1318839718378-2:2, destination = temp-queue://ID:srv007211-47019-1318835590753-11:9:1, operationType = 1, timeout = 0, brokerPath = null}, redeliveryCounter = 0, size = 0, properties = {originBrokerName=broker.coremq-behaviortracking-675-mq-01-master, originBrokerId=ID:srv007210-36808-1318839718378-0:1, originBrokerURL=stomp://srv007210:61612}, readOnlyProperties = true, readOnlyBody = true, droppable = false}
看到这些消息后,我有几个问题:
目前,我通过停用网络连接器上的bridgeTempDestinations属性来推迟问题。这样消息就不会传播,它们会更慢地填充临时空间。如果我无法修复这些消息的来源,我至少会阻止他们填充商店:
更新:我更多地监视了我的集群,发现消息被消耗了。它们被排队和分派,但是消费者(其他群集节点如同使用activemq lib的java使用者一样)无法确认消息。所以他们留在调度的消息队列中,这个队列会增长和增长。
答案 0 :(得分:1)
这是一个旧帖子,但如果有人遇到同样的问题,你可能想查看这篇文章:http://forum.spring.io/forum/spring-projects/integration/111989-jms-outbound-gateway-temporary-queues-never-deleted
该链接中的问题听起来很相似,即临时队列产生大量的咨询消息。在我的例子中,我们使用临时队列来实现同步请求/响应消息传递,但是咨询消息量导致ActiveMQ将大部分时间花在GC上并最终抛出GC Overhead Limit Exceeded Exception。这是在v5.11.1上。即使我们关闭了连接,会话,生产者,消费者,临时队列也不会是GC并且会继续接收咨询消息。
解决方法是在清理其他资源时明确删除临时队列(参见https://docs.oracle.com/javaee/7/api/javax/jms/TemporaryQueue.html)
答案 1 :(得分:0)
如果您没有使用此咨询主题 - 您可能需要按照http://activemq.2283324.n4.nabble.com/How-to-disable-advisory-for-gt-topic-ActiveMQ-Advisory-TempQueue-td2356134.html
的建议将其关闭删除咨询消息不会产生任何后果 - 因为这些只是用于系统健康分析和统计的消息。