StatisticsPlugin

功能 > 拦截器 > StatisticsPlugin

从 ActiveMQ Classic 5.3 开始,包含了一个统计插件,可用于从代理或其目标检索统计信息。请注意,消息必须包含一个 replyTo 标头(如果您使用的是 JMS,则为 jmsReplyTo 标头),否则消息将被忽略。 replyTo 标头必须包含要从中检索统计信息消息的目标名称。统计信息消息是一个 MapMessage,其中包含目标(即代理或目标)的统计信息。

要检索代理的统计信息,只需将空消息发送到名为 ActiveMQ.Statistics.Broker 的目标,并附带一个 replyTo 标头。要检索目标的统计信息,只需将空消息发送到名为 ActiveMQ.Statistics.Destination.<destination-name>ActiveMQ.Statistics.Destination.<wildcard-expression> 的目标,并附带一个 replyTo 标头。如果多个目标匹配给定的通配符表达式,则会将每个目标的一个统计信息消息发送到 replyTo 目标。

要配置 ActiveMQ Classic 以使用统计插件,只需将以下内容添加到 ActiveMQ Classic XML 配置中

<broker ...>
  <plugins>
    <statisticsBrokerPlugin/>
  </plugins>
</broker>

统计插件查找发送到特定目标的消息。以下是如何使用统计插件从代理获取统计信息的示例

Queue replyTo = session.createTemporaryQueue();
MessageConsumer consumer = session.createConsumer(replyTo);

String queueName = "ActiveMQ.Statistics.Broker";
Queue testQueue = session.createQueue(queueName);
MessageProducer producer = session.createProducer(testQueue);
Message msg = session.createMessage();
msg.setJMSReplyTo(replyTo);
producer.send(msg);

MapMessage reply = (MapMessage) consumer.receive();
assertNotNull(reply);

for (Enumeration e = reply.getMapNames();e.hasMoreElements();) {
  String name = e.nextElement().toString();
  System.out.println(name + "=" + reply.getObject(name));
}

上面代码的输出如下所示

vm=vm://127.0.0.1  
memoryUsage=0  
storeUsage=3330  
tempPercentUsage=0  
ssl=  
openwire=tcp://127.0.0.1:50059  
brokerId=ID:bigmac-50057-1253605065511-0:0  
consumerCount=2  
brokerName=localhost  
expiredCount=0  
dispatchCount=1  
maxEnqueueTime=5.0  
storePercentUsage=0  
dequeueCount=0  
inflightCount=1  
messagesCached=0  
tempLimit=107374182400  
averageEnqueueTime=5.0  
stomp+ssl=  
memoryPercentUsage=0  
size=10  
tempUsage=0  
producerCount=1  
minEnqueueTime=5.0  
dataDirectory=/Users/rajdavies/dev/projects/activemq/activemq-core/activemq-data  
enqueueCount=10  
stomp=  
storeLimit=107374182400  
memoryLimit=67108864

类似地,要查询目标的统计信息,只需向目标名称发送消息,该目标名称以 ActiveMQ.Statistics.Destination 为前缀。例如,要检索名为 TEST.FOO 的队列的统计信息,请向名为 ActiveMQ.Statistics.Destination.TEST.FOO 的队列发送空消息。以下是一个示例

Queue replyTo = session.createTemporaryQueue();
MessageConsumer consumer = session.createConsumer(replyTo);

Queue testQueue = session.createQueue("TEST.FOO");
MessageProducer producer = session.createProducer(null);

String queueName = "ActiveMQ.Statistics.Destination." + testQueue.getQueueName()
Queue query = session.createQueue(queueName);

Message msg = session.createMessage();

producer.send(testQueue, msg) 
msg.setJMSReplyTo(replyTo);
producer.send(query, msg);
MapMessage reply = (MapMessage) consumer.receive();
assertNotNull(reply);
assertTrue(reply.getMapNames().hasMoreElements());
        
for (Enumeration e = reply.getMapNames();e.hasMoreElements();) {
    String name = e.nextElement().toString();
    System.err.println(name + "=" + reply.getObject(name));
}

上面代码的输出如下所示

memoryUsage=0  
dequeueCount=0  
inflightCount=0  
messagesCached=0  
averageEnqueueTime=0.0  
destinationName=queue://TEST.FOO  
size=1  
memoryPercentUsage=0  
producerCount=0  
consumerCount=0  
minEnqueueTime=0.0  
maxEnqueueTime=0.0  
dispatchCount=0  
expiredCount=0  
enqueueCount=1  
memoryLimit=67108864

您也可以在队列名称中使用通配符。这将为每个与通配符匹配的目标生成单独的统计信息消息。非常方便。

订阅统计信息

从 5.6.0 版本开始,您还可以检索所有队列和主题订阅的统计信息。您只需要向名为 ActiveMQ.Statistics. Subscription 的目标发送空消息,并附带一个 replyTo 标头。响应将以一个或多个消息的形式出现,每个消息都包含代理上一个订阅的统计信息。

以下是如何使用统计插件从代理获取统计信息的示例

Queue replyTo = session.createTemporaryQueue();
MessageConsumer consumer = session.createConsumer(replyTo);

String queueName = "ActiveMQ.Statistics.Subscription";
Queue testQueue = session.createQueue(queueName);
MessageProducer producer = session.createProducer(testQueue);
Message msg = session.createMessage();
msg.setJMSReplyTo(replyTo);
producer.send(msg);

MapMessage reply = (MapMessage) consumer.receive();
assertNotNull(reply);

for (Enumeration e = reply.getMapNames();e.hasMoreElements();) {
  String name = e.nextElement().toString();
  System.out.println(name + "=" + reply.getObject(name));
}

上面代码的示例输出如下所示

selector=null  
dispatchedQueueSize=1  
maximumPendingMessageLimit=0  
exclusive=false  
connectionId=ID:dejan-bosanacs-macbook-pro-2.local-64989-1335528942875-4:1  
destinationName=Test.Queue  
clientId=ID:dejan-bosanacs-macbook-pro-2.local-64989-1335528942875-3:1  
slowConsumer=false  
prefetchSize=1000  
sessionId=1  
dequeueCounter=0  
enqueueCounter=1  
retroactive=false  
dispatchedCounter=1

Apache、ActiveMQ、Apache ActiveMQ、Apache 羽毛标志和 Apache ActiveMQ 项目标志是 Apache 软件基金会的商标。版权所有 © 2024,Apache 软件基金会。根据 Apache 许可证 2.0 授权。