MXBean是一種引用預定義數據類型的MBean。通過這種方式,您可以確保任何客戶機(包括遠程客戶機)都可以使用您的MBean,而不需要客戶機訪問代表MBean類型的特定的類。MXBean提供一種方便的方法來綁定數據,而不需要客戶端進行特殊的綁定操作。
類似於標準MBean,MXBean定義一個名爲SomethingMXBeans的java接口和一個java類實現。然而,不同於標準MBans,MXBeans不需要java實現類必須名爲Something。每個接口中的方法定義屬性或者操作。@MXBean註解可以用於註解Java接口,這樣接口的名稱就不必以MXBean爲結尾了。
MXBeans包含於J2SE 5.0版本的java.lang.management包中。然而,除了java.lang.management中定義的一組標準MXBeans,使用者可以定義自己的MXBeans。
MXBeans的主要思想是:MXBean接口java.lang.management.MemoryMBean 中引用的諸如java.lang.managementMemoryUsage類型,該類型映射一組稱之爲開放類型(定義爲javax.management.openbean包中)的類型。映射的具體規則詳見MXBean規範。然而,對於簡單的諸如int、String類型的映射規則保持不變,而對於複雜類型MemoryUsage則映射爲基本類型CompositeDataSupport。
MXBean的例子由如下文件構成,你可以在jmx_examples.zip中找到。
- QueueSampler定義MXBean接口
- 實現上面接口的QueueSampler類
- MXBean 接口的getQueueSample方法返回類型QueueSample類
- Main類,程序啓動類
MXBean例子上述這些類實現如下動作:
- 定義簡單的MXBean,管理Queue<String>類型的資源
- 定義getter方法:getQueueSample返回Queue的快照QueueSample類,該類將如下類綁定在一起。
- 快照時間
- 隊列queue大小
- 特定時間隊列queue的頭部
- 將MXBean註冊到MBean server
2.3.1. MXBean接口
如下代碼展示示例QueueSamplerMXBean的MXBean接口:
package com.example; public interface QueueSamplerMXBean { public QueueSample getQueueSample(); public void clearQueue(); }
注意,你聲明一個MXBean接口的方式與聲明標準MBean接口的方式完全相同。QueueSamplerMXBean接口定義getter方法:getQueueSample和操作clearQueue。
2.3.2. 定義MXBean操作
QueueSampler例子中定義的MXBean操作如下:
package com.example; import java.util.Date; import java.util.Queue; public class QueueSampler implements QueueSamplerMXBean { private Queue<String> queue; public QueueSampler (Queue<String> queue) { this.queue = queue; } public QueueSample getQueueSample() { synchronized (queue) { return new QueueSample(new Date(), queue.size(), queue.peek()); } } public void clearQueue() { synchronized (queue) { queue.clear(); } } }
QueueSampler實現MXBean接口中定義的getter方法getQueueSampler和clearQueue操作。getQueueSample操作返回QueueSample類的實例,該實例由java.util.Queue的peek方法和size方法和java.util.Data實例構造而成。
2.3.3. 定義MXBean接口返回的Java類型
QueueSampler 返回QueueSample類型的實例,代碼如下:
package com.example; import java.beans.ConstructorProperties; import java.util.Date; public class QueueSample { private final Date date; private final int size; private final String head; @ConstructorProperties({"date", "size", "head"}) public QueueSample(Date date, int size, String head) { this.date = date; this.size = size; this.head = head; } public Date getDate() { return date; } public int getSize() { return size; } public String getHead() { return head; } }
在QueueSample類中,MXBean框架調用QueueSample中所有的getter 方法將自己轉化爲CompositeDate類型的實例,同時使用@ConstructorProperities註解從CompositeData實例轉化爲QueueSample實例。
2.3.4. 在MBean server中創建並註冊MXBean
截至目前,已經定義如下內容:一個MXBean接口和它的實現類,以及實現類的返回類型。然後,MXBean必須在MXBean server進行註冊。這些操作同樣由標準MBean中的Main啓動JMX代理,只不過相關的代碼在標準MBean章節中沒有介紹。
package com.example; import java.lang.management.ManagementFactory; import java.util.Queue; import java.util.concurrent.ArrayBlockingQueue; import javax.management.MBeanServer; import javax.management.ObjectName; public class Main { public static void main(String[] args) throws Exception { MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); ... ObjectName mxbeanName = new ObjectName("com.example:type=QueueSampler"); Queue<String> queue = new ArrayBlockingQueue<String>(10); queue.add("Request-1"); queue.add("Request-2"); queue.add("Request-3"); QueueSampler mxbean = new QueueSampler(queue); mbs.registerMBean(mxbean, mxbeanName); System.out.println("Waiting..."); Thread.sleep(Long.MAX_VALUE); } }
Main執行如下操作:
- 獲得MBean server平臺。
- 爲MXBean:QueueSampler創建對象名。
- 爲MXBean:QueueSampler創建一個Queue的實例。
- 將Queue的實例傳遞給QueueSampler。
- 將MXBean註冊到MXBean server中。
2.3.5. 運行MXBean實例
MXBean實例詳見jmx_examples.zip。本例需要Java SE 6版本以上。運行步驟如下:
a)保存jmx_examples.zip到工作目錄。
b)在終端窗口中解壓壓縮包。
Unzip jmx_exampless.zip
c)在工作目錄中編譯Java代碼。
Javac com/example/*.java
d)啓動Main應用。終端會打印提示信息。
Java com.example.Main
e)在本機不同的窗口中啓動JConsole。在新建連接對話框中,展示當前可連接的JMX代理列表。
Jconsole
f)在新建連接對話框中,選擇com.example.Main並點擊連接按鈕。當前平臺的活動會展示出來。
g)點擊MBean標籤。該標籤展示當前註冊到MBean server的MBeans。
h)在左側框架中,展開MBean樹形結構中的com.example節點。你將可以看到QueueSampler。如果你點擊QueueSampler,你將看到暴露出來的屬性和方法。
i)展開屬性節點。你可以看到QueueSample屬性出現在右側標籤中,其值爲javax.management.openmbean.CompositeDataSupport。
j)雙擊CompositeDataSupport。你可以看到QueueSample中date、head和size屬性(MXBean框架將QueueSample實例轉換爲ComositeData)。如果將QueueSampler定義爲標準的MBean而不是MXBean,JConsole就不會發現QueueSample類,因爲它不會在它的類路徑中。如果QueueSampler是一個標準的MBean,在訪問QueueSample屬性值時,您將收到一個ClassNotFoundException消息。通過JConsole等通用JMX客戶機連接到JMX代理時,QueueSampler演示了使用mxbean的有用性。
k)展開操作節點。可以看到clearQueue操作的按鈕。
l)點擊clearQueue按鈕。窗口會提示clearQueue方法被調用。
m)再次展開屬性節點,雙擊CompositeDataSupport,head和sie的值將被重置。
通過“連接”->“退出”關閉JConsole。