`
ywChen
  • 浏览: 121087 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

JMX(五)Model MBean

    博客分类:
  • J2EE
 
阅读更多

1.Hello

Hello.java还是和以前的一样。这里它没有再加上一个MBean接口了,只是一个很普通的类。

package jmx.modelbean;

public class Hello{
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void printHello() {
        System.out.println("Hello World, " + name);
    }
    public void printHello(String whoName) {
        System.out.println("Hello , " + whoName);
    }
} 

 2.ModelMBeanUtils

ModelMbeanUtils这个类是要我们自己来实现的,也是写model Bean最麻烦的地方,它主要是返回一个RequiredModelMBean类,此类主要包括了一个ModelMBeanInfo类的信息。在ModelMBeanInfo中定义了所有对需要管理的属性和方法的描述。具体代码如下: 

package jmx.modelbean;

import javax.management.MBeanOperationInfo;
import javax.management.MBeanParameterInfo;
import javax.management.modelmbean.ModelMBeanAttributeInfo;
import javax.management.modelmbean.ModelMBeanInfo;
import javax.management.modelmbean.ModelMBeanInfoSupport;
import javax.management.modelmbean.ModelMBeanOperationInfo;
import javax.management.modelmbean.RequiredModelMBean;
public class ModelMBeanUtils {
    private static final boolean READABLE = true;
    private static final boolean WRITABLE = true;
    private static final boolean BOOLEAN = true;
    private static final String STRING_CLASS = "java.lang.String"; 
    public static RequiredModelMBean createModlerMBean() {
        RequiredModelMBean model = null;
        try {
            model = new RequiredModelMBean();
            model.setManagedResource(new Hello(), "ObjectReference");
            ModelMBeanInfo info = createModelMBeanInfo();
            model.setModelMBeanInfo(info);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return model;
    } 
    private static ModelMBeanInfo createModelMBeanInfo() {
        //////////////////////////////////////////////////////////////////
        //                        属性                                        //
        //////////////////////////////////////////////////////////////////
        // 构造name属性信息
        ModelMBeanAttributeInfo nameAttrInfo = new ModelMBeanAttributeInfo(//
                "Name", // 属性名       
                STRING_CLASS, //属性类型    
                "people name", // 描述文字      
                READABLE, WRITABLE, !BOOLEAN, // 读写      
                null // 属性描述子
        ); 
        //////////////////////////////////////////////////////////////////
        //                        方法                                        //
        //////////////////////////////////////////////////////////////////
        //构造 printHello()操作的信息       
        ModelMBeanOperationInfo print1Info = new ModelMBeanOperationInfo(//
                "printHello", //
                null, //  
                null, //
                "void", //  
                MBeanOperationInfo.INFO, //    
                null //
        ); 
        // 构造printHello(String whoName)操作信息     
        ModelMBeanOperationInfo print2Info;
        MBeanParameterInfo[] param2 = new MBeanParameterInfo[1];
        param2[0] = new MBeanParameterInfo("whoName", STRING_CLASS, "say hello to who");
        print2Info = new ModelMBeanOperationInfo(//
                "printHello", //
                null,//
                param2,//
                "void", //
                MBeanOperationInfo.INFO, //
                null//
        ); 
        //////////////////////////////////////////////////////////////////
        //                        最后总合                                    //
        //////////////////////////////////////////////////////////////////
        // create ModelMBeanInfo       
        ModelMBeanInfo mbeanInfo = new ModelMBeanInfoSupport(//
                RequiredModelMBean.class.getName(), // MBean类
                null, // 描述文字     
                new ModelMBeanAttributeInfo[] { // 所有的属性信息(数组)
                nameAttrInfo },//只有一个属性
                null, // 所有的构造函数信息  
                new ModelMBeanOperationInfo[] { // 所有的操作信息(数组)
                        print1Info,
                        print2Info },//
                null, // 所有的通知信息(本例无)
                null//MBean描述子
        );
        return mbeanInfo;
    }
} 

 3.HelloAgent

接下来是HelloAgent的写法,和以前就差一句:把“new Hello()”这一句删除了,加上了ModelMbeanUtils.createModlerMbean();

package jmx.modelbean;

import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import javax.management.ObjectName;
import javax.management.modelmbean.RequiredModelMBean;
import com.sun.jdmk.comm.HtmlAdaptorServer;

public class HelloAgent {
	public static void main(String[] args) throws Exception {
		MBeanServer server = MBeanServerFactory.createMBeanServer();
		ObjectName helloName = new ObjectName("chengang:name=HelloWorld");
		// Hello hello = new Hello();
		RequiredModelMBean hello = ModelMBeanUtils.createModlerMBean();
		server.registerMBean(hello, helloName);
		ObjectName adapterName = new ObjectName(
				"HelloAgent:name=htmladapter,port=8082");
		HtmlAdaptorServer adapter = new HtmlAdaptorServer();
		server.registerMBean(adapter, adapterName);
		adapter.start();
		System.out.println("start.....");
	}
} 

  

4.总结

 我们发现模型Mbean(Model MBean)要比标准MBean(standard mbean)复杂多了,那有什么理由让我们选择使用模型MBean吗?我认为,最大的理由就是模型MBean可以动态配置。试想一下这个应用场景:由于安全或其他原因,系统要把某个MBean公开的可管理方法隐藏起来。这时,如果你是用标准MBean,这需要修改接口类,然后重新编译发布;如果用Apache commons-modeler来写的模型MBean,则只需要修改XML文件就行了,不需要重新编译发布(可能要重启一下系统)。这就是模型Mbean优势之所在了。

细心的人会发现动态MBean和这一节的模型Mbean非常相似,但它们还是有很大不同的:动态MBean没有Hello类,它要自己实现Hello类中的方法逻辑。 

分享到:
评论

相关推荐

    JMX IN ACTION(七)

    Model MBean由`javax.management.modelmbean.RequiredModelMBean`类定义,它是JMX代理的一个必需部分。与Dynamic MBean类似,Model MBean的管理接口是在运行时定义的。`RequiredModelMBean`类实现了`ModelMBean`接口...

    面试官问我 JMX 了解不,我说:什么? - 知乎1

    Model MBean通过实现`javax.management.modelmbean.ModelMBeanInfo`接口来定义其行为。 JMX不仅用于JVM监控,还可以用于日志级别的动态修改,例如log4j支持通过JMX来动态调整日志级别。此外,许多监控工具,如...

    jmx学习整理里1

    Model MBean通过`javax.management.modelmbean.ModelMBean`接口和一个描述符文件(如`car-mbean-descriptor.xml`)定义其行为。 描述符文件(如`car-mbean-descriptor.xml`)包含了MBean的元数据,包括属性、操作、...

    jmx技术介绍(ppt)

    动态MBean则提供了更大的灵活性,包括Open MBean和Model MBean,用于管理动态或复杂的数据结构。 **总结** JMX技术为Java开发者提供了一套强大而灵活的工具,用于构建和集成管理功能。通过MBean,开发者可以轻松地...

    JMX、MXBean学习

    Standard MBeans是预定义了管理接口的类,Dynamic MBeans则可以在运行时动态定义其管理接口,而Model MBeans是一种抽象层,可以将任何Java对象转换为MBean。 MXBean是JMX中的一个特殊概念,它是标准MBean的扩展,...

    java利用JMX做出不一样的的JVM.docx

    MBean有四种类型:Standard MBean、Dynamic MBean、Open MBean和Model MBean。Standard MBean是最常见且最简单的形式,类似于普通的Java Bean。Dynamic MBean允许动态地获取和设置属性,适合于已存在的、不易转换为...

    Model MBean Instrumentor-开源

    JMX Instrumentor 是一个微型 Java 工具,用于将任意对象检测为 JMX 模型 MBean。 它通过反射检查对象的类并构造相应的 ModelMBeanInfo。 甚至可以通过特殊的 JMX 注释来改进此信息。

    JMX配置与使用

    Model MBeans是最通用的,它们基于元数据来定义MBean的行为。 5. 监控与通知: 通过JMX,可以注册监听器来接收关于MBean状态变化的通知。这可以用来实现自动化的故障检测、日志记录或者性能监控。此外,JMX还可以...

    JMX技术学习非常好的资料

    JMX还提供了一些附加管理协议API,如SNMP(Simple Network Management Protocol)、TMN(Telecommunications Management Network)和CIM/WBEM(Common Information Model/Web-Based Enterprise Management)。...

    JMX 相关

    4. **Model MBean**: 基于XML配置,将管理接口与实现分离。 ### MBean Server MBean Server是JMX框架的核心,它负责注册和管理MBeans,提供命名和寻址机制。它还提供了MBeans之间的交互,以及与其他管理系统(如...

    jmx资料

    MBeans分为标准MBean、Dynamic MBean和Model MBean三种类型,以适应不同的需求。Server是运行MBeans的环境,它负责注册、管理MBeans,并提供给Clients访问接口。Clients则通过连接到Server来访问和操作MBeans,实现...

    JMX specification 1.4

    #### 五、JMX 规范的应用示例 例如,在一个分布式系统中,可以使用JMX来集中监控各个节点的状态,并根据实际情况进行资源调度和故障转移。又比如,在一个Web服务器集群中,管理员可以通过JMX远程监控每个服务器的...

    JMX: Developer's Quick Start Guide

    - **Model MBeans**:模型MBeans是另一种形式的MBean,它利用反射机制自动创建一个MBean实例,而无需实现特定的接口。这种类型的MBean通常用于现有类的管理,而不需要修改源代码。 #### 五、通知机制 JMX支持一种...

    SpringJMX.pdf

    - **MBean元数据类**:描述MBean的结构和行为。 #### 五、Standard MBeans实例 - **接口定义**:Standard MBeans通常通过接口定义其公共API,接口中包含特定命名规则的方法。 - **实现类**:实现类需遵循接口定义的...

    Java Management Extensions

    实现模型MBeans通常需要使用`ModelMBean`接口,并通过`ModelMBeanInfo`类来描述MBean的行为。 #### 五、MBean服务器 MBean服务器是JMX的核心组件之一,负责注册和管理所有的MBeans。了解如何与MBean服务器交互是...

    weblogic的MX程序设计

    创建一个MBean通常需要实现`javax.management.MBean`接口或者继承自`javax.management.ModelMBean`类,并在其中定义属性和操作。完成MBean的定义后,可以将其注册到MBeanServer上。例如,以下代码展示了如何创建并...

    java tutorial

    JMX可以暴露MBean(Managed Beans),这些MBean代表了应用程序中的管理对象,可以通过JMX API进行操作。例如,你可以通过JMX监控应用性能指标,如内存使用情况、线程状态等。 总结: Java教程涵盖了从基础语法到...

    [课堂课件讲解]Java微服务实践-Spring Boot 监管.pptx

    JMX 还提供了通知模型(Notification Model),允许 MBean 广播管理事件,这种操作称之为通知。管理应用和其他对象注册成监听器。元信息类包含描述所有 MBean 管理接口的组件接口,其中包括属性、操作、通知和构造器...

Global site tag (gtag.js) - Google Analytics