JMX 标准MBean的开发应用
?以前在华为项目使用到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)