JMX 标准MBean的开发应用

 以前在华为项目使用到JMX全部是同事在jmx配置文件配置的自己根据实例应用,现在有时间,研究一下!

一、JMX简介

  JMX是一种JAVA的正式规范,它主要目的是让程序且有被管理的功能,那么怎么理解所谓的“被管理”呢?试想你开发了一个软件(如WEB网站),它是在24小时不简断运行的,那么你可能会想要“监控”这个软件的运行情况,比如收到了多少数据,有多少人登录等等。或者你又想“配置”这个软件,比如现在访问人数比较多,你想把数据连接池设置得大一些。

  当然,你也许会专门为这些管理来开发软件,但如果你借助JMX,则会发现创建这样的管理程序是如此简单。因为你无需为管理程序来开发界面,已经有通用的JMX管理软件,如MC4J,或者是用一般都附带提供的HTML网页来管理,你要做的仅仅是将自己要被管理和监控类的按照JMX规范修改一下即可。

  中间件软件WebLogic的管理页面就是基于JMX开发的,而JBoss则整个系统都基于JMX构架。下面将JMX的一些概念,从JMX规范转帖如下:

二、JMX构架中的各层及相关的组件

  1. 工具层(Instrumentation Level)
        (a) MBeans(标准的,动态的,开放的和模型MBeans)
        (b) 通知模型:Notification、NotificationListener等类
        (c) MBean元数据类:Attribute、Opreator等类
  2. 代理层(Agent Level)
        (a) MBean Server
        (b) 代理服务。如前一篇的HtmlAdaptorServer等。

 

MBean中有getter和setter的就是属性,如前一篇的Hello类中Name。如果只有getter则表示该属性只读。一共有四种MBean,如下:

  1. 标准MBeans(Standard MBeans)设计和实现是最简单的,这类MBean使用自己的方法名作为管理接口;
  2. 动态MBeans(Dynamic MBeans)必须实现一个指定的接口,由于动态MBeans在运行期间暴露它们的管理接口,因此更为灵活;
  3. 开放MBeans(Open MBeans)属于动态MBeans,这类MBean依靠基础数据类型来实现通用管理,并为友情用户进行自我声明;
  4. 模型MBeans(Model MBeans)同样也是动态MBeans,这类MBeans是完全可配置的,在运行期间进行自我声明;它们为资源动态工具提供一个一般性的,有默认行为的MBeans类。

 

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)

你可能感兴趣的:(weblogic,配置管理,项目管理,软件测试,华为)