首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

JMX学习札记(一)-MBean

2012-09-19 
JMX学习笔记(一)-MBeanJMX ? ? ? ?即 Java Management Extensions?? Java管理扩展MBean ? 即 managed bean

JMX学习笔记(一)-MBean

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

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

?

?

package com.haitao.jmx;/** * JMX MBean Interface *  * @author haitao.tu *  */public interface EchoMBean {public void print(String yourName);}
?

?

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

?

?

package com.haitao.jmx;/** * Implements of JMX EchoMBean *  * @author haitao.tu * */public class Echo implements EchoMBean {@Overridepublic void print(String yourName) {System.out.println("Hi " + yourName + "!");}}
?


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

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

package com.haitao.jmx;import java.lang.management.ManagementFactory;import javax.management.MBeanServer;import javax.management.ObjectName;/** * JMX App Demo *  * @author haitao.tu */public class App {public static void main(String[] args) throws Exception {// 创建MBeanServerMBeanServer mbs = ManagementFactory.getPlatformMBeanServer();// 新建MBean ObjectName, 在MBeanServer里标识注册的MBeanObjectName name = new ObjectName("com.haitao.jmx:type=Echo");// 创建MBeanEcho mbean = new Echo();// 在MBeanServer里注册MBean, 标识为ObjectName(com.tenpay.jmx:type=Echo)mbs.registerMBean(mbean, name);// 在MBeanServer里调用已注册的EchoMBean的print方法mbs.invoke(name, "print", new Object[] { "haitao.tu"}, 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

?

开后会看到:

JMX学习札记(一)-MBean

?

?

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

JMX学习札记(一)-MBean

?

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

?

?

2.VisualVM

?

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

?

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

?

?

JMX学习札记(一)-MBean

?

?

热点排行