`
LuisFigo
  • 浏览: 38279 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

[探究JMX] 5、动态模型MBean

阅读更多

一、简介

      Model MBean是基于DynamicMBean的更实用的MBean,如果编写被管理的类为标准MBean,我们必须为它们实现一套以MBean为后缀名的接口,这样使代码的耦合度增高。而基于Model Mbean,我们可以用配置文件等动态的方式来管理类,被管理的类可以是普通的类,这样也降低了系统的耦合性。

 

二、准备工作

 

      1、为了Web方式管理MBean,我们引入jmxtools.jar

 

三、代码实例

 

package com.muyu.jmx;

public class ConfigModel {

    private String configLocation;

    public String getConfigLocation() {
        return configLocation;
    }

    public void printConfigLocation() {
        System.out.println(configLocation);
    }

    public void printConfigLocation(String i_ConfigLocation) {
        System.out.println(i_ConfigLocation);
    }

    public void setConfigLocation(String configLocation) {
        this.configLocation = configLocation;
    }
}


 

package com.muyu.jmx;

import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import javax.management.ObjectName;
import javax.management.modelmbean.RequiredModelMBean;
import javax.management.remote.JMXConnectorServer;
import javax.management.remote.JMXConnectorServerFactory;
import javax.management.remote.JMXServiceURL;

import com.sun.jdmk.comm.HtmlAdaptorServer;

public class ConfigAgent {
    public static void main(String[] args) throws Exception {    
        MBeanServer server = MBeanServerFactory.createMBeanServer();    
        ObjectName configName = new ObjectName("LuisFigo:name=configModel");    
        RequiredModelMBean config = ModelMBean.createModelMBean();  
        server.registerMBean(config, configName);      
        ObjectName adapterName = new ObjectName("HelloAgent:name=htmladapter,port=8000");
        
        //通过Web来管理MBean
        HtmlAdaptorServer adapter = new HtmlAdaptorServer();      
        adapter.setPort(8000);
        server.registerMBean(adapter, adapterName);        
        adapter.start();  
        System.out.println("adapter start.....");    
        
        //通过RMI方式来管理MBean
        Registry registry = LocateRegistry.createRegistry(9999);
        JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:9999/mserver");        
        JMXConnectorServer cs = JMXConnectorServerFactory.newJMXConnectorServer(url, null, server); 

        cs.start();
        System.out.println("rmi start.....");
     }
}

 

package com.muyu.jmx;

import javax.management.Attribute;
import javax.management.AttributeNotFoundException;
import javax.management.Descriptor;
import javax.management.InstanceNotFoundException;
import javax.management.InvalidAttributeValueException;
import javax.management.MBeanException;
import javax.management.MBeanParameterInfo;
import javax.management.ReflectionException;
import javax.management.RuntimeOperationsException;
import javax.management.modelmbean.DescriptorSupport;
import javax.management.modelmbean.InvalidTargetObjectTypeException;
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 ModelMBean {

    private static final boolean READABLE = true;
    private static final boolean WRITABLE = true;
    private static final boolean IS = true;
    private final static String STRING_CLASS = "java.lang.String";
    
    public static RequiredModelMBean createModelMBean() throws RuntimeOperationsException,
            MBeanException, InstanceNotFoundException, InvalidTargetObjectTypeException, AttributeNotFoundException, InvalidAttributeValueException, ReflectionException {
        RequiredModelMBean modelMBean = null;
        modelMBean = new RequiredModelMBean();
        modelMBean.setManagedResource(new ConfigModel(), "ObjectReference");
        ModelMBeanInfo info = createModelMBeanInfo();
        modelMBean.setModelMBeanInfo(info);
        modelMBean.setAttribute(new Attribute("ConfigLocation", "test initial"));
        return modelMBean;
    }
    
    public static ModelMBeanInfo createModelMBeanInfo() {
        
        Descriptor portAttrDesc = new DescriptorSupport();
        portAttrDesc.setField("name", "ConfigLocation");
        portAttrDesc.setField("descriptorType", "attribute");
        portAttrDesc.setField("displayName", "ConfigLocation");
        portAttrDesc.setField("getMethod", "getConfigLocation");
        portAttrDesc.setField("setMethod", "setConfigLocation");
        
        //属性
        ModelMBeanAttributeInfo nameAttrInfo = new ModelMBeanAttributeInfo("ConfigLocation", // 属性名        
                STRING_CLASS, //属性类型     
                "luisfigo location", // 描述文字       
                READABLE, WRITABLE, !IS, // 读写       
                portAttrDesc
        );
        //方法
        Descriptor getStateDesc = new DescriptorSupport(new String[] {
                "name=getConfigLocation", "descriptorType=operation", "class=com.muyu.jmx.ConfigModel",
                "role=operation" });
        // 构造 setConfigLocation操作描述符信息
        Descriptor setStateDesc = new DescriptorSupport(new String[] {
          "name=setConfigLocation", "descriptorType=operation", "class=com.muyu.jmx.ConfigModel",
          "role=operation" });
        ModelMBeanOperationInfo getConfigLocation = new ModelMBeanOperationInfo(
                                                                      "getConfigLocation",
                                                                      "get configLocation attribute",
                                                                      null,
                                                                      "java.lang.String",
                                                                      ModelMBeanOperationInfo.ACTION,
                                                                      getStateDesc
                                                                    );
        MBeanParameterInfo[] setStateParms = new MBeanParameterInfo[] { (new MBeanParameterInfo(
                                                                                                "configLocation_para", "java.lang.String", "new configLocation value")) };
        ModelMBeanOperationInfo setConfigLocation = new ModelMBeanOperationInfo(
                                                                      "setConfigLocation",
                                                                      "set configLocation attribute",
                                                                      setStateParms,
                                                                      "void",
                                                                      ModelMBeanOperationInfo.ACTION,
                                                                      setStateDesc
                                                                    ); 

        ModelMBeanOperationInfo printConfig = new ModelMBeanOperationInfo("printConfigLocation", "控制台输出configLocation信息",
                                                                          null, "void", ModelMBeanOperationInfo.INFO, null);
        ModelMBeanOperationInfo printConfig_1 = null;
        MBeanParameterInfo[] params = new MBeanParameterInfo[1];
        params[0] = new MBeanParameterInfo("i_ConfigLocation", STRING_CLASS, "Hello , I am LuisFigo");
        printConfig_1 = new ModelMBeanOperationInfo("printConfigLocation", "控制台输出configLocation_para信息",
                                                  params, "void", ModelMBeanOperationInfo.INFO, null);
        
        ModelMBeanInfo mbeanInfo = new ModelMBeanInfoSupport(//
                                                             RequiredModelMBean.class.getName(), // MBean类
                                                             "ModelMBeanInfoSupport Dynamic MBean", // 描述文字      
                                                             new ModelMBeanAttributeInfo[] { // 所有的属性信息(数组) 
                                                             nameAttrInfo },//只有一个属性 
                                                             null, // 所有的构造函数信息   
                                                             new ModelMBeanOperationInfo[] { // 所有的操作信息(数组)
                                                                 getConfigLocation,
                                                                 setConfigLocation,
                                                                 printConfig,
                                                                 printConfig_1},//
                                                             null, 
                                                             null
                                                     );
                                                     return mbeanInfo;

    }
}

 

package com.muyu.jmx;

import java.io.IOException;
import java.util.Iterator;
import java.util.Set;

import javax.management.Attribute;
import javax.management.AttributeNotFoundException;
import javax.management.InstanceNotFoundException;
import javax.management.InvalidAttributeValueException;
import javax.management.MBeanException;
import javax.management.MBeanServerConnection;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import javax.management.ReflectionException;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;

public class ConfigClient {
    
    public static void main(String[] args) throws IOException, MalformedObjectNameException, NullPointerException, InstanceNotFoundException, MBeanException, ReflectionException, AttributeNotFoundException, InvalidAttributeValueException {
        JMXServiceURL url = new JMXServiceURL(
        "service:jmx:rmi:///jndi/rmi://localhost:9999/mserver");
        JMXConnector jmxc = JMXConnectorFactory.connect(url, null);
        MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();

        Set names = mbsc.queryNames(null, null);
        for (Iterator i = names.iterator(); i.hasNext();) {
            System.out.println("\tObjectName = " + (ObjectName) i.next());
        }

        ObjectName stdMBeanName = new ObjectName("LuisFigo:name=configModel");

        mbsc.invoke(stdMBeanName, "printConfigLocation", new String[]{"helloworld"}, new String[]{"java.lang.String"});
        mbsc.setAttribute(stdMBeanName, new Attribute("ConfigLocation", "LuisFigo, this is a new configLocation"));
        mbsc.invoke(stdMBeanName, "printConfigLocation", null, null);
        jmxc.close();
    }
    
}

 

 

说明:

      运行ConfigAgent后,在浏览器里输入地址http://localhost:8000/,点击name=configModel后进行configModel MBean管理页面,可以对configMBean进行一些操作,同第二节介绍的标准MBean很相似。运行ConfigClient可以发现,通过RMI可以管理ConfigAgent中注册的MBean。

 

四、总结

      动态ModelMBean实现了被管理类与JMX的解耦,在ModelMBean类里我们可以暴露一些操作和属性。而客户端看起来像什么事都没有发生一样。如果采用JMX来管理系统的话,我们只需要提供一个ModelMBean这样一个管理类就可以,而不需要破坏原来的系统代码,真正实现了系统与JMX的解耦。

 

 

2
2
分享到:
评论

相关推荐

    JMX模型MBean示例

    NULL 博文链接:https://jasonhan-sh-hotmail-com.iteye.com/blog/1171904

    jmx 实例 rmi mbean

    在本实例中,我们重点关注的是如何使用Remote Method Invocation(RMI)来实现JMX的MBean管理。RMI是一种在Java平台上进行远程调用的技术,使得一个Java对象的方法可以在不同的Java虚拟机(JVM)之间被调用。结合JMX...

    Java分布式应用学习笔记09JMX-MBean的介绍

    ### Java分布式应用学习笔记09JMX-MBean的介绍 #### MBean概念及作用 MBean,即Managed Bean,是在JMX(Java Management Extensions)框架中用于管理资源的一种特殊Java对象。通过MBean,可以方便地对应用程序进行...

    JMX(一)-------MBean server

    **JMX(一)——MBean Server** Java Management Extensions (JMX) 是Java平台上的一个标准,用于管理和监控应用程序、设备和服务。它提供了一个灵活的框架,使得开发者能够轻松地创建可管理的组件,并通过标准接口...

    jmx资料

    MBeans有三种类型:标准MBean、模型MBean和动态MBean。标准MBean通过特定的接口定义其管理属性和操作;模型MBean根据运行时的元数据自动生成接口;动态MBean则允许在运行时动态定义MBean的行为。 3. **MBean服务器*...

    JMX实用例子详解(包括各种Mbean)

    5. **使用JConsole或VisualVM**:这两个内置的JMX客户端工具的使用方法,包括连接到远程MBean Server、查看和修改MBean属性、接收和处理通知。 6. **编写自定义管理工具**:介绍如何使用JMX API创建自己的管理工具...

    jmx mbean学习 jmxtools下载

    黑心的人都5分下载分,csdn也不让选择免费了,不想下载的直接看一下解释: http://java.sun.com/javase/technologies/core/mntr-mgmt/javamanagement/download.jsp JMX 1.2.1 Reference Implementation(重点) ...

    JMX官方文档 - 概览,入门,规范

    - 动态MBean:不依赖于特定类,其接口动态定义。 - Open MBean:提供通用数据类型,便于跨平台交换管理信息。 2. MBean操作: - 注册:将MBean添加到MBean服务器中。 - 查询:根据指定的条件查找MBeans。 - ...

    JMX小例子以及介绍

    - **MBean(Managed Beans)**: MBean是JMX中最基本的管理单元,它是Java对象,代表可管理的资源或服务。MBean可以是标准MBean、开放MBean或模型MBean,每种类型都有不同的接口和注册方式。 - **MBean Server**: 这...

    jmx 入门文档,附有开发实例文档

    3. **模型MBean**:模型MBean通过元数据描述其属性、操作和通知,这样可以更灵活地处理各种类型的MBean,而无需为每个MBean创建单独的接口。 4. **开放MBean**:开放MBean提供了一种标准的数据类型和转换机制,使得...

    书籍JMX-IN-ACTION

    接着,书中的章节详细讲述了如何创建自定义MBean,包括标准MBean、开放MBean和模型MBean的不同类型,以及它们的注册和管理过程。此外,书中还讨论了MBean服务器的选择和配置,如内置MBean服务器和远程MBean服务器的...

    jmxri-1.2.1

    5. **适配器与代理**:JMXri提供了多种适配器,使得非JMX应用程序也能与JMX环境交互。此外,还可以通过代理服务在不同的JMX域之间进行通信。 总的来说,`jmxri-1.2.1`是JMX框架中不可或缺的一部分,尤其是在需要...

    jmx.rar_jmx

    有标准MBean、开放MBean、模型MBean和动态MBean四种类型,它们各有不同的创建和使用方式。 2. **MBeanServer**:MBeanServer是JMX架构的核心组件,负责注册、管理MBean以及处理MBean之间的交互。开发者可以通过...

    Jmx实例demo下载

    5. **JMX连接器**:`jmxdemo`可能包含了JMX连接器的配置,如RMI连接器,允许远程客户端连接到MBean服务器进行管理操作。 6. **客户端示例**:项目可能还包含一个简单的客户端示例,展示了如何使用JMX API连接到...

    论文研究-JMX技术在网络监控中的应用.pdf

    MBean分为标准MBean、动态MBean、开放MBean和模型MBean等不同类型,它们分别适用于不同的监控和管理场景。 JMX技术的另一个重要概念是通知。通知是JMX框架用来实现异步通信的一种机制。当MBean的某个属性发生变化,...

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

    4. **Model MBean**:是Dynamic MBean的一种增强,它提供了一种模型化的方式,允许将任何Java对象封装为MBean,而无需直接实现`DynamicMBean`接口。Model MBean通过实现`javax.management.modelmbean.ModelMBeanInfo...

    JMX HelloWorld Download

    有标准MBean、模型MBean和动态MBean三种类型。 3. **MBean Server**:MBean Server是JMX框架的中心,负责注册MBean、执行MBean的操作以及处理MBean之间的交互。 4. **JMX连接器**:JMX连接器允许远程客户端连接到...

    jmx技术介绍(ppt)

    MBean是JMX的核心元素,分为标准MBean和动态MBean。标准MBean适用于定义明确、稳定的资源,它们基于Java Bean模式,通过内省机制获取属性和方法信息。动态MBean则提供了更大的灵活性,包括Open MBean和Model MBean,...

    JMX开发入门

    2. **动态MBean**:不依赖于固定的接口,而是通过运行时的MBeanInfo接口动态地描述其属性和操作。 3. **开放MBean**:使用特定的元数据类(如MBeanInfo和MBeanAttributeInfo)来提供更精确的类型信息,便于跨Java...

    JMX实例与应用模型下载

    JMX应用实例与实现,通过一个简单的JavaWeb应用来验证JMX在应用中的植入管理和应用

Global site tag (gtag.js) - Google Analytics