【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

分享到:     
發佈了29 篇原創文章 · 獲贊 9 · 訪問量 36萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章