`
suhuanzheng7784877
  • 浏览: 701313 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
Ff8d036b-05a9-33b5-828a-2633bb68b7e6
读金庸故事,品程序人生
浏览量:47680
社区版块
存档分类
最新评论

Java分布式应用学习笔记09JMX-MBean的介绍(JMX的一点点补充)

阅读更多

1.  MBean介绍

从上一篇Blog的内容可以看到,我们大多数代码工作量都是自定义的一个JavaBean,这个JavaBean有属性、访问器(get)、写操作(set),之后还可以定义一些非常规方法,比如执行核心管理操作的方法,甚至还可以深度调用full gc进行全面的资源回收。也就是说这个JavaBean并不像它的名字那么简单,它负责了一些监管任务等等。使用者灵活地使用JMX客户端工具,比如咱们上一章介绍的JConsole。借助Sprng框架,给开发者的感觉就是仅仅开发这种JavaBean就可以了。这种看似简单的JavaBean叫做MBean(管理构建),比较权威的定义是:在JMX规范中,管理构件定义如下:它是一个能代表管理资源的Java对象,遵从一定的设计模式,还需实现该规范定义的特定的接口。该定义了保证了所有的管理构件以一种标准的方式来表示被管理资源。

资源是什么?程序、日志、持久化数据、硬件、内存、网络吞吐量等等皆可看作是系统资源。管理资源暴露出一些信息,让外部能够进行远程查看和远程监管,这就是管理构建要做的事情。当然了管理构建MBean还得支持类似于JMS那种订阅/通知的机制。

2.  MBean的类型

标准管理构建,学名——Standard MBean,本身暴露MBean需要符合某些命名规范,比如类结尾以MBean等等,但是使用了框架,这些限制就被透明化了。换句话说开发者只需要定制一个POJO即可,之后暴露即可。这也是上一章节的那些JMX——MBean

public class ServerImpl { 
    public final long startTime; 
    public ServerImpl() { 
        startTime = System.currentTimeMillis(); 
    } 
 } 

 

之后对其进行监管

public class ServerMonitor implements ServerMonitorMBean { 
    private final ServerImpl target; 
    public ServerMonitor(ServerImpl target){ 
        this.target = target; 
    } 
    public long getUpTime(){ 
        return System.currentTimeMillis() - target.startTime; 
    } 
 } 

 

之后就是暴露MBean服务

import javax.management.MBeanServer; 
 import javax.management.MBeanServerFactory; 
 import javax.management.ObjectName; 
 public class Main { 
    private static ObjectName objectName ; 
    private static MBeanServer mBeanServer; 
    public static void main(String[] args) throws Exception{ 
        init(); 
        manage();               
    } 
    private static void init() throws Exception{ 
        ServerImpl serverImpl = new ServerImpl(); 
        ServerMonitor serverMonitor = new ServerMonitor(serverImpl); 
        mBeanServer = MBeanServerFactory.createMBeanServer(); 
        objectName = new ObjectName("objectName:id=ServerMonitor1"); 
        mBeanServer.registerMBean(serverMonitor,objectName);  
    } 
    private static void manage() throws Exception{ 
        Long upTime = (Long) mBeanServer.getAttribute(objectName, 
        "upTime"); 
        System.out.println(upTime); 
    } 
 } 
 

动态代理构建,学名——DynamicMBean,这个笔者觉得有点像Java的反射机制的一个使用场景,就是在运行期间,你不知道你系统要调用哪个类、哪个方法,但是又想在运行期间顺利的调用到该方法,那怎么办?动态MBean可以解决这个问题。

实现javax.management.DynamicMBean 接口和它定义的方法,即可,该接口定义了以下6个方法:

getMBeanInfo

getAttribute

setAttribute

getAttributes

setAttributes

invoke

从方法名字上可以知晓和Java的反射机制差不多啊,都是获得对象的一些元数据,之后进行动态invoke。这里插一句,既然可以动态invoke调用动态MBean的方法,是不是就意味着可以像AOP面向切面编程一样对动态MBean进行横向侵入呢?答案是肯定的。由于DynamicMBean的接口是不变的,因此可以屏蔽实现细节。由于这种在运行期获取管理接口的特性,动态管理构件提供了更大的灵活性。

我们依然看看网上的一个经典实例

import javax.management.*; 
 import java.lang.reflect.*; 
 public class ServerMonitor implements DynamicMBean { 
 
    private final ServerImpl target;    
    private MBeanInfo mBeanInfo;    
        
    public ServerMonitor(ServerImpl target){ 
        this.target = target; 
    } 
    
    // 实现获取被管理的 ServerImpl 的 upTime 
    public long upTime(){ 
        return System.currentTimeMillis() - target.startTime; 
    } 

	 //javax.management.MBeanServer 会通过查询 getAttribute("Uptime") 获得 "Uptime" 属性值
    public Object getAttribute(String attribute) throws AttributeNotFoundException, 
		 MBeanException, ReflectionException { 
        if(attribute.equals("UpTime")){ 
            return upTime(); 
        } 
        return null; 
    } 
	
	 // 给出 ServerMonitor 的元信息。  
    public MBeanInfo getMBeanInfo() { 
        if (mBeanInfo == null) { 
            try { 
                Class cls = this.getClass(); 
                // 用反射获得 "upTime" 属性的读方法
                Method readMethod = cls.getMethod("upTime", new Class[0]); 
                // 用反射获得构造方法
                Constructor constructor = cls.getConstructor(new Class[] 
					 {ServerImpl.class}); 
                // 关于 "upTime" 属性的元信息 : 名称为 UpTime,只读属性 ( 没有写方法 )。
                MBeanAttributeInfo upTimeMBeanAttributeInfo = new MBeanAttributeInfo( 
                        "UpTime", "The time span since server start", 
                        readMethod, null); 
                // 关于构造函数的元信息
                MBeanConstructorInfo mBeanConstructorInfo = new MBeanConstructorInfo( 
                        "Constructor for ServerMonitor", constructor); 
                //ServerMonitor 的元信息,为了简单起见,在这个例子里,
                // 没有提供 invocation 以及 listener 方面的元信息 
                mBeanInfo = new MBeanInfo(cls.getName(), 
                        "Monitor that controls the server", 
                        new MBeanAttributeInfo[] { upTimeMBeanAttributeInfo }, 
                        new MBeanConstructorInfo[] { mBeanConstructorInfo }, 
                        null, null);                
            } catch (Exception e) { 
                throw new Error(e); 
            } 

        } 
        return mBeanInfo; 
    } 

    public AttributeList getAttributes(String[] arg0) {        
        return null; 
    } 
        
    public Object invoke(String arg0, Object[] arg1, String[] arg2) 
		 throws MBeanException, 
		 ReflectionException {        
        return null; 
    } 

    public void setAttribute(Attribute arg0) throws AttributeNotFoundException, 
		 InvalidAttributeValueException, MBeanException, ReflectionException { 
        return;        
    } 

    public AttributeList setAttributes(AttributeList arg0) {        
        return null; 
    }   
 } 

 

开放式管理构建,学名——Open MBean,开放管理构件是一种专门化的动态管理构件,其中所有的与该管理构件相关的参数、返回类型和属性都围绕一组预定义的数据类型(StringIntegerFloat 等)来建立,并且通过一组特定的接口来进行自我描述。JMX代理通过获得一个OpenMBeanInfo对象来获取开放管理构件的管理接口,OpenMBeanInfoMbeanInfo的子类。很可惜,这个没实例,也不经常使用。希望经常使用这个的童鞋将这块补上。

模型MBean,学名——ModelMBean,模型管理构件也是一种专门化的动态管理构件。普通的动态管理构建通常缺乏一些管理系统所需要的支持:比如持久化MBean的状态、日志记录、缓存等等。如果让用户去实现这些功能确实比较繁琐。为了减轻用户的负担,JMX 提供商都会提供不同的ModelBean实现。其中有一个接口是Java规范中规定所有厂商必须实现的:javax.management.modelmbean.RequiredModelBean。通过配置描述信息,我们可以定制这个ModelBean,指定哪些MBean状态需要记入日志、如何记录以及是否缓存某些属性、缓存多久等等。还是使用网上实例

public class Server { 

	 private long startTime; 
	
	 public Server() { 	 } 
	
	 public int start(){ 
		 startTime = System.currentTimeMillis(); 
		 return 0; 
	 } 
	
	 public long getUpTime(){ 
		 return System.currentTimeMillis() - startTime; 
	 } 
 }

 

之后也是暴露如下

import javax.management.*; 
import javax.management.modelmbean.*; 
public class Main { 

    public static void main(String[] args) throws Exception{ 
        MBeanServer mBeanServer = MBeanServerFactory.createMBeanServer(); 
        RequiredModelMBean serverMBean = 
            (RequiredModelMBean) mBeanServer.instantiate( 
            "javax.management.modelmbean.RequiredModelMBean"); 

        ObjectName serverMBeanName = 
            new ObjectName("server: id=Server"); 
        serverMBean.setModelMBeanInfo(getModelMBeanInfoForServer(serverMBeanName)); 
        Server server = new Server(); 
        serverMBean.setManagedResource(server, "ObjectReference"); 

        ObjectInstance registeredServerMBean = 
            mBeanServer.registerMBean((Object) serverMBean, serverMBeanName); 

        serverMBean.invoke("start",null, null); 

        Thread.sleep(1000); 

        System.out.println(serverMBean.getAttribute("upTime")); 
        Thread.sleep(5000); 
        System.out.println(serverMBean.getAttribute("upTime")); 
    } 

    private static ModelMBeanInfo getModelMBeanInfoForServer(ObjectName objectName) 
        throws Exception{ 
        ModelMBeanAttributeInfo[] serverAttributes = 
            new ModelMBeanAttributeInfo[1]; 
        Descriptor upTime = 
            new DescriptorSupport( 
            new String[] { 
                "name=upTime", 
                "descriptorType=attribute", 
                "displayName=Server upTime", 
                "getMethod=getUpTime",           
            }); 
            serverAttributes[0] = 
                new ModelMBeanAttributeInfo( 
                "upTime", 
                "long", 
                "Server upTime", 
                true, 
                false, 
                false, 
            upTime); 

        ModelMBeanOperationInfo[] serverOperations = 
            new ModelMBeanOperationInfo[2]; 

        Descriptor getUpTimeDesc = 
            new DescriptorSupport( 
            new String[] { 
                "name=getUpTime", 
                "descriptorType=operation", 
                "class=modelmbean.Server", 
                "role=operation"          
            }); 

        MBeanParameterInfo[] getUpTimeParms = new MBeanParameterInfo[0]; 
        serverOperations[0] = new ModelMBeanOperationInfo("getUpTime", 
            "get the up time of the server", 
            getUpTimeParms, 
            "java.lang.Long", 
            MBeanOperationInfo.ACTION, 
        getUpTimeDesc); 
    
        Descriptor startDesc = 
            new DescriptorSupport( 
            new String[] { 
                "name=start", 
                "descriptorType=operation", 
                "class=modelmbean.Server", 
                "role=operation"
            }); 
        MBeanParameterInfo[] startParms = new MBeanParameterInfo[0]; 
        serverOperations[1] = new ModelMBeanOperationInfo("start", 
            "start(): start server", 
            startParms, 
            "java.lang.Integer", 
            MBeanOperationInfo.ACTION, 
        startDesc); 

        ModelMBeanInfo serverMMBeanInfo = 
            new ModelMBeanInfoSupport( 
            "modelmbean.Server", 
            "ModelMBean for managing an Server", 
            serverAttributes, 
            null, 
            serverOperations, 
        null); 

        //Default strategy for the MBean. 
        Descriptor serverDescription = 
            new DescriptorSupport( 
            new String[] { 
                ("name=" + objectName), 
                "descriptorType=mbean", 
                ("displayName=Server"), 
                "type=modelmbean.Server", 
                "log=T", 
                "logFile=serverMX.log", 
                "currencyTimeLimit=10" }); 
        serverMMBeanInfo.setMBeanDescriptor(serverDescription); 
        return serverMMBeanInfo; 
    } 

 

通常开发JMX都有以下几个步骤:

创建一个MBServermBeanServe

获得管理资源用的MBeanserverBean

给这个MBean一个ObjectNameserverMBeanName

serverBeanserverMBeanName注册到mBeanServer上去。

这篇总结大多数是查看的网络资料,学习交流而已,比较理论化,以下是查询的几篇资料链接。JMX工作原理图如下

 

参考资料:

http://www.ibm.com/developerworks/cn/java/j-lo-jse63/index.html

http://www.cnblogs.com/aurawing/articles/1887060.html

http://baike.baidu.com/view/866268.htm

 

  • 大小: 21.8 KB
分享到:
评论
2 楼 LinApex 2014-08-03  
很好的资料
1 楼 gaimule_like 2011-10-09  
谢谢博主的分享

相关推荐

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

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

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

    java

    Java分布式应用学习笔记08JMX规范与各种监控场景.pdf

    Java Management Extensions (JMX) 是Java平台上的一个标准,它定义了一种管理和监控Java应用程序的机制。JMX规范允许开发者创建可管理的组件,并通过管理系统(如JConsole)进行监控和控制。这些组件称为MBeans...

    Jboss控制台jmx-console的安全设置

    Jboss控制台jmx-console的安全设置

    JBOSS4设置控制台jmx-console登录密码

    在IT领域,特别是对于使用JBOSS的企业级应用服务器的管理员和开发者而言,掌握如何设置JBOSS控制台(具体为jmx-console)的登录密码是一项至关重要的技能。这不仅关乎系统的安全性,还直接影响到对服务器监控和管理...

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

    总的来说,JMX和MBean Server提供了一种标准、灵活的管理方式,使得Java应用的管理和监控变得更加便捷。通过结合Spring框架,开发者可以更轻松地在应用中集成JMX功能,实现对应用的全方位管理。

    jmx-1_2_1-ri.zip jmx_remote-1_0_1_03-ri.zip jmx-1_1-mr-spec.zip

    Java Management Extensions(JMX)是Java平台上的一个标准技术,用于管理和监控应用程序、操作系统和网络设备等资源。这里提到的三个ZIP文件包含了不同版本的JMX实现和规范,分别是: 1. **jmx-1_2_1-ri.zip**:这...

    tomcat-catalina-jmx-remote-9.0.5.jar

    tomcat-catalina-jmx-remote-9.0.5 tomcat-catalina-jmx-remote-9.0.5.jar

    jmx-1_2_1-ri.zip

    通过研究"jmx-1_2_1-ri.zip"中的源代码,开发者可以学习到如何创建自定义MBeans,如何与MBean服务器交互,以及如何利用JMX进行复杂的监控和管理任务。对于开发高效、可扩展和可管理的Java应用程序来说,深入理解JMX...

    jmx-tools.zip

    Java Management Extensions(JMX)是Java平台上的一个标准技术,用于管理和监控应用程序、服务和设备。JMX提供了创建、配置、查询和管理管理对象(MBeans)的能力,这些对象可以代表任何可管理的资源,从操作系统到...

    jmx-1.2.1(jmxri+jmxtools) jar

    总的来说,"jmx-1.2.1(jmxri+jmxtools) jar"是Java环境中管理和监控的重要工具集,它提供了远程访问和管理Java应用的能力,以及一系列辅助工具和库,使得开发者和运维人员能够更好地控制和理解他们的Java系统。

    Java 分布式应用程序设计

    在Java世界中,分布式应用程序设计是一项关键技能,它允许开发者构建可扩展的、高可用性的系统,能够跨越多个网络节点协同工作。以下是对标题和描述中所提及知识点的详细阐述: 1. **Java分布式计算基础**:Java为...

    jmx-1_2_1-ri.jar

    Java Management Extensions(JMX)是Java平台上的一个标准技术,用于管理和监控应用程序、操作系统和网络设备等资源。它提供了一种灵活的框架,允许开发者创建和注册管理接口,以便于远程管理和监控Java应用。在您...

    jbaoo4.2.3-jmx-console未授权访问.docx

    jbaoo4.2.3-jmx-console未授权访问

    申乐 磁保持继电器 JMX-100F 产品样本.rar

    申乐公司是知名的继电器制造商,其JMX-100F磁保持继电器是他们产品线中的一个重要成员。这款继电器采用磁保持技术,具有高效、稳定和低功耗的特点。 磁保持继电器的工作原理是基于电磁场的原理,它在没有电流通过时...

    jmx-1_2_1-bin,jmxremote-1_0_1-bin,com.sun.jdmk.comm.HtmlAdaptorServer

    csdn有一个下载包含HtmlAdaptorServer这个class,不过不知道是不是官方的,而且跟网上介绍的资料不一样,所以自己去oracle官网找着下载下来分享给大家,只要2分啦 包含资源文件为如下: jmx_remote-1_0_1_03-ri.zip jmx-1...

    catalina-jmx-remote.jar

    tomcat-catalina-jmx-remote-8.0.21.jar架包,用于jconsole使用时tomcat无法启动报错

    catalina-jmx-remote.rar

    `catalina-jmx-remote.rar`这个压缩包文件,显然与通过JMX远程访问Catalina相关,让我们深入探讨一下这个主题。 首先,理解JMX的原理和作用是至关重要的。JMX允许开发者创建和注册管理对象(MBeans),这些对象代表...

Global site tag (gtag.js) - Google Analytics