2010-12-07 22:20 15360人阅读 评论(5) 收藏 举报
 分类:
JMX(11) 

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

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

  1. package com.haitao.jmx;
  2. /**
  3. * JMX MBean Interface
  4. *
  5. * @author haitao.tu
  6. *
  7. */
  8. public interface EchoMBean {
  9. public void print(String yourName);
  10. }
  1. package com.haitao.jmx;
  2. /**
  3. * JMX MBean Interface
  4. *
  5. * @author haitao.tu
  6. *
  7. */
  8. public interface EchoMBean {
  9. public void print(String yourName);
  10. }

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

  1. package com.haitao.jmx;
  2. /**
  3. * Implements of JMX EchoMBean
  4. *
  5. * @author haitao.tu
  6. *
  7. */
  8. public class Echo implements EchoMBean {
  9. @Override
  10. public void print(String yourName) {
  11. System.out.println("Hi " + yourName + "!");
  12. }
  13. }
  1. package com.haitao.jmx;
  2. /**
  3. * Implements of JMX EchoMBean
  4. *
  5. * @author haitao.tu
  6. *
  7. */
  8. public class Echo implements EchoMBean {
  9. @Override
  10. public void print(String yourName) {
  11. System.out.println("Hi " + yourName + "!");
  12. }
  13. }

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

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

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

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

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

JMX学习笔记(一)-MBean的更多相关文章

  1. JMX学习笔记(二)-Notification

    Notification通知,也可理解为消息,有通知,必然有发送通知的广播,JMX这里采用了一种订阅的方式,类似于观察者模式,注册一个观察者到广播里,当有通知时,广播通过调用观察者,逐一通知. 这里写 ...

  2. JMX学习笔记(三)-MXBean

    在MBean中有只要遵循以下两个规则,我们就可以在jconsole中动态的改变MBean中的属性值 1. JMX中要定义接口必须以xxxMBean的规范定义 2. 得有类实现xxxMBean接口 例如 ...

  3. springmvc学习笔记---idea创建springmvc项目

    前言: 真的是很久没搞java的web服务开发了, 最近一次搞还是读研的时候, 想来感慨万千. 英雄没落, Eclipse的盟主地位隐隐然有被IntelliJ IDEA超越的趋势. Spring从2. ...

  4. GC学习笔记

    GC学习笔记 这是我公司同事的GC学习笔记,写得蛮详细的,由浅入深,循序渐进,让人一看就懂,特转到这里. 一.GC特性以及各种GC的选择 1.垃圾回收器的特性 2.对垃圾回收器的选择 2.1 连续 V ...

  5. 非常详细GC学习笔记

    转载:http://blog.csdn.net/fenglibing/article/details/6321453 这是我公司同事的GC学习笔记,写得蛮详细的,由浅入深,循序渐进,让人一看就懂,特转 ...

  6. 很具体GC学习笔记

    GC学习笔记 这是我公司同事的GC学习笔记,写得蛮具体的,由浅入深,循序渐进,让人一看就懂,特转到这里. 一.GC特性以及各种GC的选择 1.垃圾回收器的特性 2.对垃圾回收器的选择 2.1 连续 V ...

  7. spring学习笔记(一) Spring概述

    博主Spring学习笔记整理大部分内容来自Spring实战(第四版)这本书.  强烈建议新手购入或者需要电子书的留言. 在学习Spring之前,我们要了解这么几个问题:什么是Spring?Spring ...

  8. JVM调优- 学习笔记(转)

    http://blog.csdn.net/fenglibing/article/details/6321453 GC学习笔记 这是我公司同事的GC学习笔记,写得蛮详细的,由浅入深,循序渐进,让人一看就 ...

  9. ZooKeeper学习笔记一:集群搭建

    作者:Grey 原文地址:ZooKeeper学习笔记一:集群搭建 说明 单机版的zk安装和运行参考:https://zookeeper.apache.org/doc/r3.6.3/zookeeperS ...

随机推荐

  1. day63-webservice 07.07.如何修改cxf配置文件路径

    为什么第一次访问http://localhost:8080/cxf-web-server/service有点慢?证明第一次访问的时候CXFServlet被初始化了被加载了.一般是让CXFServlet ...

  2. 写个js 分页玩玩(原创)

    <ul id="page"> <li class="pagetest">1</li> <li class=" ...

  3. java基本数据类型(二)和分支结构

    基本数据类型(四类八种):不能为null一.整数型 byte----2的8次方 short----2的16次方 int----2的32次方 long----2的64次方二.浮点型 float----4 ...

  4. 由于管理员设置的策略,该磁盘处于脱机状态"解决办法

    .运行:cmd .输入:DISKPART.exe .DISKPART> san .DISKPART> san policy=onlineall .DISKPART>list disk ...

  5. PyQt5信号-槽机制

    signal -> emit -> slot signal.connect(slot) signal.disconnect(slot) 信号 (singal) 可以连接无数多个槽 (slo ...

  6. How to solve a login problem of SQL Server?

    Sometimes when we attempting to login the SQL Server 20xx Management Studio, when we type in the cor ...

  7. 关于React-native的介绍以及环境搭建

    React-Native介绍(后面内容的RN就是指react-native) 由facebook公司推出的,基于react,能开发原生app 原理: 1. 利用react框架写好js代码 2. 利用p ...

  8. oracle 表锁定解锁

    Oracle数据库操作中,我们有时会用到锁表查询以及解锁和kill进程等操作,那么这些操作是怎么实现的呢?本文我们主要就介绍一下这部分内容.(1)锁表查询的代码有以下的形式:select count( ...

  9. (转)基于MVC4+EasyUI的Web开发框架经验总结(3)- 使用Json实体类构建菜单数据

    http://www.cnblogs.com/wuhuacong/p/3669708.html 最近花了不少时间在重构和进一步提炼我的Web开发框架上,力求在用户体验和界面设计方面,和Winform开 ...

  10. RabbitMQ学习之队列监控

    对于RabbitMQ的监控,除了服务器基本信息(硬盘.CPU.内存.IO等)以及MQ的进程和端口,我们也可以通过请求url访问管理API监控其集群和队列的情况.在Javaapi 3.6.0以后,cha ...