网元监控之-activemq

activeMQ监控

1. JMX连接器-rmi

1.1 定义

  • JMX API定义了一个标准连接器 - RMI Connector,它支持通过RMI远程访问一个MBeanServer

1.2 RMI连接器服务器

  • 地址示例如下:

    service:jmx:rmi://localhost:1099/jndi/rmi://localhost:8899/myname

  • 在这个JMXServiceURL中:

    1. 第一个rmi指的是rmi连接器,表示用连接器使用RMI传输协议,第二个rmi指定RMI注册RMI连服务接器存储存根
    2. localhost:1099: 这个是connector server的IP和端口,该部分是一个可选项,可以被省略掉。如果省略的话,则connector server会随机任意选择一个可用的端口
    3. /jndi/rmi://localhost:8899/myname: 这个是connector server的路径,表示Connector server的stud是使用JNDI API绑定在rmi://localhost:8899/myname这个地址上

1.3 创建一个RMI connector server

  • 通常是提供一个RMI connector server的连接器地址,用JMXConnectorServerFactory.newJMXConnectorServer方法来创建RMI connector cerver
  • 参考 : JMX API

1.4 example

package com.uxsino.ActiveMQTest;

import java.io.IOException;
import java.util.Arrays;
import javax.management.InstanceNotFoundException;
import javax.management.IntrospectionException;
import javax.management.MBeanServerConnection;
import javax.management.MBeanServerInvocationHandler;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import javax.management.ReflectionException;
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.activemq.broker.jmx.TopicViewMBean;

public class ActiveMQTest {
public static void main(String[] args) throws IOException, MalformedObjectNameException, InstanceNotFoundException,
IntrospectionException, ReflectionException {
String url = "service:jmx:rmi:///jndi/rmi://192.168.5.90:11099/jmxrmi";
JMXServiceURL urls = new JMXServiceURL(url);
JMXConnector connector;
MBeanServerConnection conn;
BrokerViewMBean mBean;
try {
connector = JMXConnectorFactory.connect(urls, null);
System.out.println("=" + connector.getConnectionId() + "");
// connector.connect();
conn = connector.getMBeanServerConnection();
} catch (Exception e) {
System.out.println("连接失败");
return;
}
ObjectName name = new ObjectName("org.apache.activemq:brokerName=localhost,type=Broker");
mBean = (BrokerViewMBean) MBeanServerInvocationHandler.newProxyInstance(conn, name, BrokerViewMBean.class,
true);
// System.out.println("++++=" + mBean.getTotalConsumerCount() + "==++");

System.out.println("++++++++++++++" + mBean.getTotalEnqueueCount() + "+++++++++++");
System.out.println("++++++++++++++" + mBean.getTotalDequeueCount() + "+++++++++++");
System.out.println("++++++++++++++" + mBean.getTotalConsumerCount() + "+++++++++++");
System.out.println("++++++++++++++" + mBean.getTotalMessageCount() + "+++++++++++");
System.out.println("++++++++++++++" + mBean.getTotalConsumerCount() + "+++++++++++");

/* System.out.println("Domains:---------------");
String domains[] = conn.getDomains();
for (int i = 0; i < domains.length; i++) {
System.out.println("\tDomain[" + i + "] = " + domains[i]);
}*/

/System.out.println("all ObjectName:---------------");
Set set = conn.queryMBeans(null, null);
for (Iterator it = set.iterator(); it.hasNext()😉 {
ObjectInstance oi = (ObjectInstance) it.next();
System.out.println("\t" + oi.getObjectName());
System.out.println("\t" + oi.getClassName());
}
/

/System.out.println("org.apache.activemq:brokerName=localhost,type=Broker:---------------");
ObjectName mbeanName = new ObjectName("org.apache.activemq:brokerName=localhost,type=Broker");
MBeanInfo info = conn.getMBeanInfo(mbeanName);
System.out.println("Class: " + info.getClassName());
if (info.getAttributes().length > 0) {
for (MBeanAttributeInfo m : info.getAttributes())
System.out.println("\t ==> Attriber:" + m.getName());
}
if (info.getOperations().length > 0) {
for (MBeanOperationInfo m : info.getOperations())
System.out.println("\t ==> Operation:" + m.getName());
}
/

// 这里brokerName的b要小些,大写会报错
// ObjectName name = new ObjectName("org.apache.activemq:brokerName=localhost,type=Broker");

ObjectName[] os = mBean.getQueues();
System.out.println(mBean.getQueueSubscribers());
for (ObjectName na : os) {// 获取点对点的队列 mBean.getTopics() 获取订阅模式的队列
QueueViewMBean queueBean = (QueueViewMBean) MBeanServerInvocationHandler.newProxyInstance(conn, na,
QueueViewMBean.class, true);
StringBuffer sb = new StringBuffer("");
sb.append("name" + "" + "queueSize" + "" + "name" + "");

System.out.println("******************************");
System.out.println("队列的名称:" + queueBean.getName());
System.out.println("队列中剩余的消息数:" + queueBean.getQueueSize());
System.out.println("消费者数:" + queueBean.getConsumerCount());
System.out.println("出队列的数量:" + queueBean.getDequeueCount());
System.out.println("内存使用百分比:" + queueBean.getMemoryPercentUsage());
System.out.println("内存限制:" + queueBean.getMemoryLimit());
System.out.println("内存限制:" + queueBean.getQueueSize());
}

System.out.println("===============================================");
ObjectName[] oo = mBean.getTopics();
System.out.println(Arrays.toString(oo));
for (ObjectName na : oo) {
TopicViewMBean tb = (TopicViewMBean) MBeanServerInvocationHandler.newProxyInstance(conn, na,
TopicViewMBean.class, true);
System.out.println("**********-----------***********");
System.out.println("队列的名称:" + tb.getName());
System.out.println("队列中剩余的消息数:" + tb.getQueueSize());
System.out.println("消费者数:" + tb.getConsumerCount());
System.out.println("出队列的数量:" + tb.getDequeueCount());
System.out.println("内存使用百分比:" + tb.getMemoryPercentUsage());
}
connector.close();
}
}

posted @ 2018-02-02 16:29  壹颗赛艇  阅读(303)  评论(0)    收藏  举报