zoukankan      html  css  js  c++  java
  • JMX学习笔记(一)-MBean

     

    JMX学习笔记(一)-MBean

    标签: jmxstringjavainterfaceexceptionclass
     分类:

    JMX        即 Java Management Extensions   Java管理扩展
    MBean   即 managed beans                         被管理的Beans

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

    Java代码 复制代码
    1. package com.haitao.jmx;   
    2.   
    3. /**  
    4.  * JMX MBean Interface  
    5.  *   
    6.  * @author haitao.tu  
    7.  *   
    8.  */  
    9. public interface EchoMBean {   
    10.   
    11.     public void print(String yourName);   
    12.   
    13. }  
    [java] view plain copy
     
    1. package com.haitao.jmx;  
    2.   
    3. /** 
    4.  * JMX MBean Interface 
    5.  *  
    6.  * @author haitao.tu 
    7.  *  
    8.  */  
    9. public interface EchoMBean {  
    10.   
    11.     public void print(String yourName);  
    12.   
    13. }  

    很简单的,在EchoMBean接口中,定义了一个print方法,带一个yourName的String类型参数,只有接口貌似没什么用,下边我们实现这个接口

    Java代码 复制代码
    1. package com.haitao.jmx;   
    2.   
    3. /**  
    4.  * Implements of JMX EchoMBean  
    5.  *   
    6.  * @author haitao.tu  
    7.  *  
    8.  */  
    9. public class Echo implements EchoMBean {   
    10.   
    11.     @Override  
    12.     public void print(String yourName) {   
    13.         System.out.println("Hi " + yourName + "!");   
    14.     }   
    15.        
    16. }  
    [java] view plain copy
     
    1. package com.haitao.jmx;  
    2.   
    3. /** 
    4.  * Implements of JMX EchoMBean 
    5.  *  
    6.  * @author haitao.tu 
    7.  * 
    8.  */  
    9. public class Echo implements EchoMBean {  
    10.   
    11.     @Override  
    12.     public void print(String yourName) {  
    13.         System.out.println("Hi " + yourName + "!");  
    14.     }  
    15.       
    16. }  


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

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

    Java代码 复制代码
    1. package com.haitao.jmx;   
    2.   
    3. import java.lang.management.ManagementFactory;   
    4.   
    5. import javax.management.MBeanServer;   
    6. import javax.management.ObjectName;   
    7.   
    8. /**  
    9.  * JMX App Demo  
    10.  *   
    11.  * @author haitao.tu  
    12.  */  
    13. public class App {   
    14.        
    15.     public static void main(String[] args) throws Exception {   
    16.         // 创建MBeanServer   
    17.         MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();   
    18.            
    19.         // 新建MBean ObjectName, 在MBeanServer里标识注册的MBean   
    20.         ObjectName name = new ObjectName("com.haitao.jmx:type=Echo");   
    21.            
    22.         // 创建MBean   
    23.         Echo mbean = new Echo();   
    24.            
    25.         // 在MBeanServer里注册MBean, 标识为ObjectName(com.tenpay.jmx:type=Echo)   
    26.         mbs.registerMBean(mbean, name);   
    27.   
    28.            
    29.         // 在MBeanServer里调用已注册的EchoMBean的print方法   
    30.         mbs.invoke(name, "print", new Object[] { "haitao.tu"}, new String[] {"java.lang.String"});   
    31.            
    32.         Thread.sleep(Long.MAX_VALUE);   
    33.     }   
    34.   
    35. }  
    [java] view plain copy
     
    1. package com.haitao.jmx;  
    2.   
    3. import java.lang.management.ManagementFactory;  
    4.   
    5. import javax.management.MBeanServer;  
    6. import javax.management.ObjectName;  
    7.   
    8. /** 
    9.  * JMX App Demo 
    10.  *  
    11.  * @author haitao.tu 
    12.  */  
    13. public class App {  
    14.       
    15.     public static void main(String[] args) throws Exception {  
    16.         // 创建MBeanServer  
    17.         MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();  
    18.           
    19.         // 新建MBean ObjectName, 在MBeanServer里标识注册的MBean  
    20.         ObjectName name = new ObjectName("com.haitao.jmx:type=Echo");  
    21.           
    22.         // 创建MBean  
    23.         Echo mbean = new Echo();  
    24.           
    25.         // 在MBeanServer里注册MBean, 标识为ObjectName(com.tenpay.jmx:type=Echo)  
    26.         mbs.registerMBean(mbean, name);  
    27.   
    28.           
    29.         // 在MBeanServer里调用已注册的EchoMBean的print方法  
    30.         mbs.invoke(name, "print", new Object[] { "haitao.tu"}, new String[] {"java.lang.String"});  
    31.           
    32.         Thread.sleep(Long.MAX_VALUE);  
    33.     }  
    34.   
    35. }  



    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

    开后会看到:

    选择com.haitao.jmx.App,然后点击连接, 选择MBean后会看到

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

    2.VisualVM

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

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

  • 相关阅读:
    控制内插表达式的格式
    MySQL查看实时执行的SQL语句
    测试开源.net 混淆器ConfuserEx
    nginx 目录自动加斜线”/”
    兼职程序员一般可以从什么平台接私活?
    .NET之Hangfire快速入门和使用
    c#通过操作mongodb gridfs实现文件的数据库存储
    c# .net core + .net framework mongodb nuget 包
    asp.net core ModelState 模型状态验证扩展类
    Linux查看系统基本信息,版本信息(最全版)
  • 原文地址:https://www.cnblogs.com/developer-ios/p/5775762.html
Copyright © 2011-2022 走看看