【摘要】
cmdline-jmxclient-0.10.3.jar是一个开源jar包,在zabbix3.0中常用于测试的一个工具,可以用来测试jmx是否配置正确。在监控方面后还可以对Tomcat各种属性进行监控。本文主要从源码jar包反编译后生成的class文件源码进行说明,分析获取监控属性的原理。
【正文】
CATALINA_OPTS=”$CATALINA_OPTS
-Dcom.sun.management.jmxremote
-Djava.rmi.server.hostname=192.168.23.1
-Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false”
ip是你要监控的tomcat所在服务器的ip地址,端口号,是你要开启的监控端口号。ssl,false表示不使用ssl链接authenticate,false表示不使用监控,即不需要用户名和密码。实际配置如图:
2.获取配置原理
传入特定的IP和端口以及类型区域和Bean属性名称连接JVM,获取Bean下面的相关属性。(
可以传入上文中配置账号密码进行权限校验)
源码为cmdline-jmxclient-0.10.3.jar反编译出来的java文件
2.源码分析
主函数入口:
public static void main(String[] args) throws Exception {
Client client = new Client();
Logger l = Logger.getLogger("");
Handler[] hs = l.getHandlers(); //日志队列
for(int i = 0; i < hs.length; i++) {
Handler h = hs[0];
if (h instanceof java.util.logging.ConsoleHandler) {
client.getClass(); h.setFormatter(new OneLineSimpleLogger(client));
}
}
client.execute(args);
}
主要执行函数:protected void execute(String[] args)
JMXServiceURL rmiurl = new JMXServiceURL("service:jmx:rmi://" + hostport + "/jndi/rmi://" + hostport + "/jmxrmi");
4.连接客户端:
jmxc = JMXConnectorFactory.connect(rmiurl, formatCredentials(userpass));
5.获取连接对象:
MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();
6.获取Bean的实例名
ObjectInstance instance = (ObjectInstance)beans.iterator().next();
7.连接Bean对象,传入client,实例名和操作命令(单Bean和多Bean分别处理)
doBean(mbsc, instance, command);
8.获取属性列表
listOptions(mbsc, instance);
操作相关的略:doSubCommand(mbsc, instance, command[i]);
核心方法是两个递归:recurseCompositeData
recurseTabularData
9.获取属性信息
MBeanInfo info = mbsc.getMBeanInfo(instance.getObjectName());
MBeanAttributeInfo[] attributes = info.getAttributes();
讲属性信息打印输出:
if (attributes.length > 0) {
System.out.println("Attributes:");
for (int i = 0; i < attributes.length; i++) {
System.out.println(' ' + attributes[i].getName() + ": " + attributes[i].getDescription() + " (type=" + attributes[i].getType() + ")");
}
}
10.关闭连接
jmxc.close();
使用demo:
java -jar cmdline-jmxclient-0.10.3.jar – 192.168.163.213:12346 java.lang:type=Memory NonHeapMemoryUsage
获取堆内存状况,返回值
committed: 24313856
init: 24313856
max: 136314880 (堆最大分配空间)
used: 16842264 (当前堆使用空间)
通过采用cmdline-jmxclient-0.10.3.jar获取jvm信息的方式存在返回结果格式不确定的问题,难以用共性凝练以及复用。并且cmdline-jmxclient-0.10.3.jar中采用的jdk语法多为java Platfrom SE5.0和java Platfrom SE6.0。在更高级的jdk版本当中会有一些方法的弃用,对于语法兼容性和bug问题存在未知方向。
后期研究方向为使用jolokia获取监控信息,对中间件进行监控修改,jolokia的优点是返回的参数为json类型,方便处理。