首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

JMX 基准MBean的开发应用

2012-11-01 
JMX 标准MBean的开发应用?以前在华为项目使用到JMX全部是同事在jmx配置文件配置的自己根据实例应用,现在有

JMX 标准MBean的开发应用

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

一、JMX简介

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

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

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

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

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

?

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

    标准MBeans(Standard MBeans)设计和实现是最简单的,这类MBean使用自己的方法名作为管理接口; 动态MBeans(Dynamic MBeans)必须实现一个指定的接口,由于动态MBeans在运行期间暴露它们的管理接口,因此更为灵活; 开放MBeans(Open MBeans)属于动态MBeans,这类MBean依靠基础数据类型来实现通用管理,并为友情用户进行自我声明; 模型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)

1 楼 wuliupo 2010-01-21   引用JMX的标准MBean的接口必须以XxxxMXBean格式名称

或者以XxxxMBean格式
类名以MXBean或MBean结尾都可以 2 楼 asialee 2010-03-15   lz这个是一个model mbean的例子,还有能不能写一下项目中使用MBean的意图呢? 还有lz对MBean的Notification熟悉不,那天请教一下。

热点排行