/**
*
*/
package com.zznode.jms;
import javax.management.MBeanServerConnection;
import javax.management.MBeanServerInvocationHandler;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import org.apache.activemq.broker.jmx.BrokerViewMBean;
import org.apache.activemq.broker.jmx.QueueViewMBean;
import org.apache.log4j.Logger;
/**
*
* 访问ActiveMQ JMX配置
*
* @author Chaisson
*
*/
public class ActiveMQMonitorServer {
private static Logger logger = Logger.getLogger(ActiveMQMonitorServer.class);
protected JMXConnector connector;
//protected String jmxUrl = "service:jmx:rmi:///jndi/rmi://10.40.93.81:2099/jmxrmi";
protected String jmxUrl = "service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi";
/**
* 监控消息的方法
* @throws Exception
*/
public void monitorQueue() throws Exception{
logger.info("==========Connection =================");
MBeanServerConnection msconn = connector.getMBeanServerConnection();
ObjectName name = new ObjectName("org.apache.activemq:brokerName=localhost,type=Broker"); //注意BrokerName和Type的首字母大小写
BrokerViewMBean mbean = (BrokerViewMBean) MBeanServerInvocationHandler.newProxyInstance(msconn, name, BrokerViewMBean.class, true);
logger.info("BrokerId ="+mbean.getBrokerId());
logger.info("============Queue===================");
for (ObjectName queueName : mbean.getQueues()) {
logger.info(queueName);
QueueViewMBean queueMbean = (QueueViewMBean) MBeanServerInvocationHandler.newProxyInstance(msconn, queueName, QueueViewMBean.class,true);
logger.info("QueueName(队列名称) ="+queueMbean.getName());
logger.info("ConsumerCount(消费者数) ="+queueMbean.getConsumerCount());
logger.info("DequeueCount(出列消息数量) ="+queueMbean.getDequeueCount());
logger.info("EnqueueCount(入列消息数量) ="+queueMbean.getEnqueueCount());
logger.info("DispatchCount(发送消息数量) ="+queueMbean.getDispatchCount());
logger.info("QueueSize(队列大小) ="+queueMbean.getQueueSize());
logger.info("MemoryLimit(内存大小) ="+queueMbean.getMemoryLimit());
}
}
/**
* 初始化消息的方法
*
* @throws Exception
*/
protected void init() throws Exception {
// JMXConnector
JMXServiceURL url = new JMXServiceURL(jmxUrl);
connector = JMXConnectorFactory.connect(url, null);
connector.connect();
}
public static void main(String[] args) {
ActiveMQMonitorServer m = new ActiveMQMonitorServer();
try {
m.init();
m.monitorQueue();
} catch (Exception e) {
e.printStackTrace();
}
}
}
遇到一个报错:javax.management.InstanceNotFoundException: org.apache.activemq:BrokerName=localhost,Type=Broker
后来在网上找了一下,发现是BrokerName和Type大小写错了,再后来才发现有些activeMQ是小写,有些是大写。
如发现此类问题,可以通过jconsole查看一下,如图: