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);
- }
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 Echoimplements EchoMBean {
- @Override
- public void print(String yourName) {
- System.out.println("Hi " + yourName +"!");
- }
- }
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類的實例對象被管理起來:
- 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 staticvoid 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);
- }
- }
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
開後會看到:
選擇com.haitao.jmx.App,然後點擊連接, 選擇MBean後會看到
這裏可以直接調用Echo的print方法, 當然大家看到這裏邊還有好多其他的table,包括概述、內存、線程、類、VM摘要、MBean。
2.VisualVM
VisualVM的位置在%JAVA_HOME%\bin\jvisualvm.exe
打開後經過連接我們會看到類似的效果: