【JMX】JMX学习笔记(一)-MBean

JMX学习笔记(一)-MBean
  • 博客分类:
  • java

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.  
package com.haitao.jmx;

/**
 * JMX MBean Interface
 * 
 * @author haitao.tu
 * 
 */
public interface EchoMBean {

	public void print(String yourName);

}

很简单的,在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 Echoimplements EchoMBean { 
  10.  
  11.     @Override 
  12.     public void print(String yourName) { 
  13.         System.out.println("Hi " + yourName +"!"); 
  14.     } 
  15.      
package com.haitao.jmx;

/**
 * Implements of JMX EchoMBean
 * 
 * @author haitao.tu
 *
 */
public class Echo implements EchoMBean {

	@Override
	public void print(String yourName) {
		System.out.println("Hi " + yourName + "!");
	}
	
}


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 staticvoid 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.  
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 {
		// 创建MBeanServer
		MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
		
		// 新建MBean ObjectName, 在MBeanServer里标识注册的MBean
		ObjectName name = new ObjectName("com.haitao.jmx:type=Echo");
		
		// 创建MBean
		Echo 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

开后会看到:

jconsole

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

jconsole-MBean

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

2.VisualVM

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

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

VisualVM

分享到:     
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值