一、通过JMX控制台监控
在activemq的配置文件中增加JMX配置
配置文件位置:${ActiveMQ.Base}/conf/activemq.xml
将broker节点添加属性useJmx
<broker useJmx="true" brokerName="BROKER1">
...
</broker>
运行jconsole.exe,位置为${JAVA_HOME}/bin/jconsole.exe
url填写:
service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi
二、JMXAPI开发
配置文件位置:${ActiveMQ.Base}/conf/activemq.xml
将broker节点添加属性useJmx,添加managementContext节点,配置连接端口
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" dataDirectory="${activemq.data}" useJmx="true">
<managementContext>
<managementContext connectorPort="2011" jmxDomainName="my-broker"/>
</managementContext>
</broker>
通过URL:service:jmx:rmi:///jndi/rmi://localhost:2011/jmxrmi初始化JMXConnector
通过NAME:my-broker:BrokerName=localhost,Type=Broker获取BrokerViewMBean,可以获取Broker的相关属性,可以通过BrokerViewMBean获取QueueViewMBean及TopicViewMBean等,从而得到Queue及Topic的属性。
具体实现参考JMX API
public static void main(String[] args) throws Exception {
JMXServiceURL url = new JMXServiceURL(
"service:jmx:rmi:///jndi/rmi://localhost:2011/jmxrmi");
JMXConnector connector = JMXConnectorFactory.connect(url, null);
connector.connect();
MBeanServerConnection connection = connector.getMBeanServerConnection();
ObjectName name = new ObjectName(
"my-broker:BrokerName=localhost,Type=Broker");
BrokerViewMBean mbean = (BrokerViewMBean) MBeanServerInvocationHandler
.newProxyInstance(connection, name, BrokerViewMBean.class, true);
log("**************");
log("getBrokerId:" + mbean.getBrokerId());
log("getBrokerName:" + mbean.getBrokerName());
log("getTotalMessageCount:" + mbean.getTotalMessageCount());
log("getTotalEnqueueCount:" + mbean.getTotalEnqueueCount());
log("getTotalDequeueCount:" + mbean.getTotalDequeueCount());
log("**************");
log("==============");
ObjectName[] queueNames = mbean.getQueues();
log("getQueues count:" + queueNames.length);
for (ObjectName queueName : queueNames) {
QueueViewMBean queueMbean = (QueueViewMBean) MBeanServerInvocationHandler
.newProxyInstance(connection, queueName,
QueueViewMBean.class, true);
log("------------");
log("queueName:" + queueMbean.getName());
log("queuesize:" + queueMbean.getQueueSize());
log("getEnqueueCount:" + queueMbean.getEnqueueCount());
log("getDequeueCount:" + queueMbean.getDequeueCount());
}
log("==============");
log("++++++++++++++");
ObjectName[] topicNames = mbean.getTopics();
log("topic count:" + topicNames.length);
for (ObjectName topicName : topicNames) {
TopicViewMBean topicMBean = (TopicViewMBean) MBeanServerInvocationHandler
.newProxyInstance(connection, topicName,
TopicViewMBean.class, true);
log("------------");
log("topivName:"+topicMBean.getName());
log("topivSize:"+topicMBean.getQueueSize());
log("getEnqueueCount:"+topicMBean.getEnqueueCount());
log("getDequeueCount:"+topicMBean.getDequeueCount());
}
log("++++++++++++++");
}