以前在华为项目使用到JMX全部是同事在jmx配置文件配置的自己根据实例应用,现在有时间,研究一下!
一、JMX简介
JMX是一种JAVA的正式规范,它主要目的是让程序且有被管理的功能,那么怎么理解所谓的“被管理”呢?试想你开发了一个软件(如WEB网站),它是在24小时不简断运行的,那么你可能会想要“监控”这个软件的运行情况,比如收到了多少数据,有多少人登录等等。或者你又想“配置”这个软件,比如现在访问人数比较多,你想把数据连接池设置得大一些。
当然,你也许会专门为这些管理来开发软件,但如果你借助JMX,则会发现创建这样的管理程序是如此简单。因为你无需为管理程序来开发界面,已经有通用的JMX管理软件,如MC4J,或者是用一般都附带提供的HTML网页来管理,你要做的仅仅是将自己要被管理和监控类的按照JMX规范修改一下即可。
中间件软件WebLogic的管理页面就是基于JMX开发的,而JBoss则整个系统都基于JMX构架。下面将JMX的一些概念,从JMX规范转帖如下:
二、JMX构架中的各层及相关的组件
MBean中有getter和setter的就是属性,如前一篇的Hello类中Name。如果只有getter则表示该属性只读。一共有四种MBean,如下:
package com.vnvtrip;
/**
* JMX的标准MBean的接口必须以XxxxMXBean格式名称
*
* @author longgangbai
*
*/
public interface MonitorMXBean {
public int getStatus();
public void setStatus(int status);
public double getNumber();
public void setNumber(double number);
public String getUsername();
public void setUsername(String username);
}
package com.vnvtrip;
/**
*
* JMX的实现类的实现JMX的接口类
*
* @author longgangbai
*
*/
public class MonitorCPU implements MonitorMXBean {
private String username = "xiao66li";
/**
* CPU的使用状态
*/
private int status;
/**
* CPU的使用量
*/
private double number;
/*
* (non-Javadoc)
*
* @see com.vnvtrip.IMonitorCPU#getStatus()
*/
public int getStatus() {
return status;
}
/*
* (non-Javadoc)
*
* @see com.vnvtrip.IMonitorCPU#setStatus(int)
*/
public void setStatus(int status) {
this.status = status;
}
/*
* (non-Javadoc)
*
* @see com.vnvtrip.IMonitorCPU#getNumber()
*/
public double getNumber() {
return number;
}
/*
* (non-Javadoc)
*
* @see com.vnvtrip.IMonitorCPU#setNumber(double)
*/
public void setNumber(double number) {
this.number = number;
}
/*
* (non-Javadoc)
*
* @see com.vnvtrip.IMonitorCPU#getUsername()
*/
public String getUsername() {
return username;
}
/*
* (non-Javadoc)
*
* @see com.vnvtrip.IMonitorCPU#setUsername(java.lang.String)
*/
public void setUsername(String username) {
this.username = username;
}
}
package com.vnvtrip;
import javax.management.Attribute;
import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import javax.management.ObjectName;
/**
* JMX的测试类的应用
*
* @author longgangbai
*
*/
public class MonitorCPUAgent {
public static void main(String args[]) {
try {
/**
* 通过JMX的MBean服务工厂获取JMX的服务
*/
MBeanServer mbeanserver = MBeanServerFactory.createMBeanServer();
// 创建一个实例的名称
ObjectName objectName = new ObjectName("bean:type=MonitorCPU");
// 创建原始对象
MonitorMXBean cpu = new MonitorCPU();
// 注册JMX的MBean对象
mbeanserver.registerMBean(cpu, objectName);
Object atrris = mbeanserver.getAttribute(objectName, "Username");
System.out.println(" username= " + atrris);
// 设置对象的各种属性(可能在客户端设置)
mbeanserver.setAttribute(objectName, new Attribute("Username",
"xiaobai"));
// 服务端根据实例信息监测是否变化
atrris = mbeanserver.getAttribute(objectName, "Username")
.toString();
System.out.println(" Username= " + atrris);
} catch (Exception e) {
e.printStackTrace();
}
}
}
输出结果如下:
username= xiao66li
Username= xiaobai
注意如果你的JMX的MXBean命名有问题:发生此类异常:主要原因JMX的MXBean的命名规则不符合标准。
javax.management.NotCompliantMBeanException: MBean class com.vnvtrip.MonitorCPU does not implement DynamicMBean, neither follows the Standard MBean conventions (javax.management.NotCompliantMBeanException: Class com.vnvtrip.MonitorCPU is not a JMX compliant Standard MBean) nor the MXBean conventions (javax.management.NotCompliantMBeanException: com.vnvtrip.MonitorCPU: Class com.vnvtrip.MonitorCPU is not a JMX compliant MXBean)
at com.sun.jmx.mbeanserver.Introspector.checkCompliance(Introspector.java:160)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerMBean(DefaultMBeanServerInterceptor.java:305)
at com.sun.jmx.mbeanserver.JmxMBeanServer.registerMBean(JmxMBeanServer.java:482)
at com.vnvtrip.MonitorCPUAgent.main(MonitorCPUAgent.java:27)