Java管理擴展特殊MBean之MXBean學習

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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章