zoukankan      html  css  js  c++  java
  • JMX学习一

    JMX的一些概念

    MBean:是Managed Bean的简称。在JMX中MBean代表一个被管理的资源实例,通过MBean中暴露的方法和属性,外界可以获取被管理的资源的状态和操纵MBean的行为。事实上,MBean就是一个Java Object,同JavaBean模型一样,外界使用自醒和反射来获取Object的值和调用Object的方法,只是MBean更为复杂和高级一些。 

    MBeanServer:MBean生存在一个MBeanServer中。MBeanServer管理这些MBean,并且代理外界对它们的访问。并且MBeanServer提供了一种注册机制,是的外界可以通过名字来得到相应的MBean实例。 

    JMX Agent:Agent只是一个Java进程,它包括这个MBeanServer和一系列附加的MbeanService。当然这些Service也是通过MBean的形式来发布。 

    Protocol Adapters and Connectors 
    JMX Agent通过各种各样的Adapter和Connector来与外界(JVM之外)进行通信。同样外界(JVM之外)也必须通过某个Adapter和Connector来向JMX Agent发送管理或控制请求。 
    Adapter和Connector的区别在于:Adapter是使用某种Internet协议来与JMX Agent获得联系,Agent端会有一个对象(Adapter)来处理有关协议的细节。比如SNMP Adapter和HTTP Adapter。而Connector则是使用类似RPC的方式来访问Agent,在Agent端和客户端都必须有这样一个对象来处理相应的请求与应答。比如RMI Connector。 
    JMX Agent可以带有任意多个Adapter,因此可以使用多种不同的方式访问Agent。 

    jmx中的三层结构: 
    Instrumentation 层:Instrumentation层主要包括了一系列的接口定义和描述如何开发MBean的规范。通常JMX所管理的资源有一个或多个MBean组成,因此这个资源可以是任何由Java语言开发的组件,或是一个JavaWrapper包装的其他语言开发的资源。 

    Agent 层:Agent用来管理相应的资源,并且为远端用户提供访问的接口。Agent层构建在Intrumentation层之上,并且使用并管理Instrumentation层内部描述的组件。通常Agent由一个MBeanServer和多个系统服务组成。另外Agent还提供一个或多个Adapter或Connector以供外界的访问。 
    JMX Agent并不关心它所管理的资源是什么。 

    Distributed 层:Distributed层关心Agent如何被远端用户访问的细节。它定义了一系列用来访问Agent的接口和组件,包括Adapter和Connector的描述。 

    一个MBean是一个被管理的Java对象,有点类似于JavaBean,一个设备、一个应用或者任何资源都可以被表示为MBean,MBean会暴露一个接口对外,这个接口可以读取或者写入一些对象中的属性,通常一个MBean需要定义一个接口,以MBean结尾, 例如: EchoMBean, 格式为XXXMBean,这个是规范,必须得遵守。

    例如:

    package com.dxz.mbean.demo1;
    
    public interface EchoMBean {
        public void print(String yourName);
    }
    
    package com.dxz.mbean.demo1;
    
    public class Echo implements EchoMBean {
    
        public void print(String yourName) {
            System.out.println("Hi " + yourName + "!");
        }
    
    }

    Echo实现了EchoMBean接口,很简单我们只是print了hi yourName!

    按照JMX的定义,是被管理的对象,现在我们只是定义了该对象,并没有被管理,接着我们让这个Echo类的实例对象被管理起来:

    package com.dxz.mbean.demo1;
    
    import java.lang.management.ManagementFactory;
    
    import javax.management.MBeanServer;
    import javax.management.ObjectName;
    
    public class App {
        public static void main(String[] args) throws Exception {   
            // 创建MBeanServer   
            MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();   
               
            // 新建MBean ObjectName, 在MBeanServer里标识注册的MBean   
            ObjectName name = new ObjectName("com.dxz.demo1.mbean:type=Echo");   
               
            // 创建MBean   
            Echo mbean = new Echo();   
               
            // 在MBeanServer里注册MBean, 标识为ObjectName(com.dxz.mbean:type=Echo)   
            mbs.registerMBean(mbean, name);   
      
               
            // 在MBeanServer里调用已注册的EchoMBean的print方法   
            mbs.invoke(name, "print", new Object[] { "china sf"}, new String[] {"java.lang.String"});   
               
            Thread.sleep(Long.MAX_VALUE);   
        }   
    }

    1. 首先我们在App类中向ManagementFactory申请了一个MBeanServer对象
    2. 接着我们即然要使Echo的实例对象被管理起来,我们就需要给这个对象一个标识,这个标识是ObjectName.注意这个ObjectName构造函数,这里使用了(包名:type=类名)的形式.
    3. 然后我们通过mbs.registerMBean方法注册了echo,并传入了ObjectName在MBeanServer中标识该MBean.
    4. 随后我们通过mbs.invoke方法调用了已经注册的Echo的print方法,通过ObjectName找到该MBean, 并通过最后两个参数,传入print方法执行的参数,与参数的类型。
    5. 最后我们sleep主线程,等待其他线程的调用.
    通过这个例子我们可以看出,MBean的好处,在Echo的实例对象未被管理之前,我们只能通过Echo对象的句柄,来调用Echo里的public方法,在被管理之后,我们可以通过MBeanServer的句柄mbs来调用Echo对象的print方法。
    更详细的内容,我们可以通过JDK自带工具jconsole或者 VisualVM 来查看MBean:

    1.jconsole

    jconsole的位置在%JAVA_HOME%/bin/jconsole.exe

    开后会看到:

    C:Users1107252>jconsole

    选择demo1.App然后点击连接, 选择MBean后会看到

    这里可以直接调用Echo的print方法, 当然大家看到这里边还有好多其他的table,包括概述、内存、线程、类、VM摘要、MBean。

    2.VisualVM

    VisualVM的位置在%JAVA_HOME%/bin/jvisualvm.exe

    打开后经过连接我们会看到类似的效果:

  • 相关阅读:
    Jmeter自动化测试工具的简单使用--HTTP测试
    学习前端编程之前的一些建议
    深入浅出C#中的静态与非静态
    Jenkins 基于svn部署的两种方式
    粒子群基础
    python环境搭建:python3环境安装+pycharm工具使用
    python 空字符串是其他任何字符的子集
    文件复制 4种方法用时比较
    map,list,set的遍历方法
    JSP学习日记(四)
  • 原文地址:https://www.cnblogs.com/duanxz/p/4526612.html
Copyright © 2011-2022 走看看