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. WPF中StringToImage和BoolToImage简单用法

    在WPF的绑定控件操作中,经常会通过bool值或者某些特定的string值做出相应动作.但UI层控件的很多属性对应的都不是Bool值或者对应的只是固定的String值. 这个时候有两方法解决该问题. ...

  2. linux 标准输出和后台运行

    一.后台运行程序 至需要在命令后面加上一个 & 即可 # command & 例如: python test.py & 二.标准输出.标准错误输出 # command > ...

  3. Arduino-IIC-Wire.h

    前言:Wire.h是Arduino的IIC库. 一.Wire库函数 Wire.begin() Wire.requestFrom() Wire.beginTransmission() Wire.endT ...

  4. ios网络模拟

    ios网络模拟 在ios开发和测试中,需要针对不同网络状况做一下测试优化,如果在真机上用真实网络的话,需要不同网络(2G.3G.4G)的手机卡,比较麻烦. 其实可以模拟不同网络状况,以下分别针对真机和 ...

  5. Hadoop MapReduce编程 API入门系列之多个Job迭代式MapReduce运行(十二)

    推荐 MapReduce分析明星微博数据 http://git.oschina.net/ljc520313/codeexample/tree/master/bigdata/hadoop/mapredu ...

  6. Unity3d gameObject

    using UnityEngine; using System.Collections; public class test : MonoBehaviour { //print只能在MonoBehav ...

  7. pc端和移动端的轮播图实现(只是结构,内容以后慢慢补充)

    轮播图 PC端 移动端 原生js的写法 图片顺序 8123456781 设置计时器 当过度完成之后判断index是否到达两边界限,是的话设置位移 手指touchstart时,获取位置,暂停计时器 手指 ...

  8. 爱,死亡和机器人 第十四集 齐马蓝 中文字幕(Python处理utf8文件获取想要的内容)

    处理代码 file = "a.srt" fi = open(file, mode='r') a = fi.readline() i = 1 while len(str(a)) != ...

  9. hdu3938 Portal 离线的并查集

    离线算法是将全部输入都读入,计算出所有的答案以后再输出的方法.主要是为避免重复计算.类似于计算斐波那契数列的时候用打表的方法. 题目:给一个无向图,求有多少个点对,使得两点间的路径上的花费小于L,这里 ...

  10. spring中log4j的使用---转载

    原文链接:http://www.codeceo.com/article/log4j-usage.html 日志是应用软件中不可缺少的部分,Apache的开源项目log4j是一个功能强大的日志组件,提供 ...