JMX In Action 總結(二)–HelloWorld例子 – JAVA編程語言程序開發技術文章

這篇寫一個簡單的HelloWorld例子。
    首先準備環境,我使用的JDK1.6,1.5應該也可以。還需要去oracle下載JMX RI包,地址為:jsp-141676.html”>http://www.oracle.com/technetwork/java/javase/tech/download-jsp-141676.html,下載“JMX 1.2 Reference Implementation”,解壓以後lib目錄下有兩個jar包,把jmxtool.jar加到CLASSPATH中就可以瞭,它裡面有一個接下去要用到的Html適配器。
    1、首先寫一個HelloWorld MBean,它由一個接口和一個實現類組成,代碼如下:
public interface HelloWorldMBean {
    public void setGreeting(String greeting);
    public String getGreeting();
    public void printGreeting();
}
    寫實現類HelloWorld:
public class HelloWorld implements HelloWorldMBean {


    private String greeting = null;


    public HelloWorld() {
        this.greeting = “Hello World! I am a Standard MBean”;
    }


    public HelloWorld(String greeting) {
        this.greeting = greeting;
    }


    public void setGreeting(String greeting) {
        this.greeting = greeting;
    }


    public String getGreeting() {
        return greeting;
    }


    public void printGreeting() {
        System.out.println(greeting);
    }


}   
    這樣,一個HelloWorld的MBean就完成瞭,這是一個標準MBean。必須把MBean註冊到Agent才能使用,接下來寫一個Agent。


    2、定義JMX Agent:HelloAgent,他有三個任務:
    1)、創建MBean Server實例。
    2)、創建HTML適配器和HTML客戶端連接。
    3)、註冊一個新的HelloWorld的MBean實例。
    代碼如下:
     public class HelloAgent {


    private MBeanServer mbs = null;


    public HelloAgent() {
        mbs = MBeanServerFactory.createMBeanServer(“HelloAgent”);


        HtmlAdaptorServer adapter = new HtmlAdaptorServer();
        HelloWorld hw = new HelloWorld();
        ObjectName adapterName = null;
        ObjectName helloWorldName = null;
        try {
            helloWorldName = new ObjectName(“HelloAgent:name=helloWorld1”);
            mbs.registerMBean(hw, helloWorldName);
            adapterName = new ObjectName(“HelloAgent:name=htmladapter,port=9092”);
            adapter.setPort(9092);
            mbs.registerMBean(adapter, adapterName);
            adapter.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    public static void main(String args[]) {
        System.out.println(“HelloAgent is running”);
        HelloAgent agent = new HelloAgent();
    }
}
    這段代碼首先創建一個MBean Server實例和一個Html適配器實例,MBean Server使用工廠類創建,創建的時候傳入字符串作為MBean Server的域名,域名是區別MBean Server的標識。
    接下來實例化HelloWorld MBean,並在MBean Server中註冊。註冊的時候使用一個ObjectName實例,ObjectName類在JMX中為MBean提供瞭一套命名系統,是註冊在MBean Server中的唯一標識。它有兩部分組成:
    1)、域名:這個域名通常和MBean Server的域名一致,如果不一致,則意味著與其他MBean隔離。
    2)、零個或多個key=value串,中間用逗號隔開,這個串用來區別MBean,也可以為MBean提供信息。
    下一步是註冊Html適配器,Html適配器也是一個MBean,並啟動適配器。


    以上兩步就是我們例子的代碼,基本結構圖如下:
   



    3、運行例子。HelloAgent類有main方法,直接運行就可以瞭,如果成功就會出現“HelloAgent is running”。然後打開瀏覽器,輸入:http://localhost:9092/,因為代碼中Html的適配器端口設置為9092。


    以上3步完成瞭整個HelloWorld例子,通過瀏覽器提供瞭3種頁面:
    1、Agent頁面,也就是第一個看到的頁面,上面Agent內包含的MBean的一個總覽,它顯示瞭所有的註冊在裡面的MBean,通過註冊時候使用的ObjectName實例來顯示。可以通過最上面的文本框來過濾需要顯示的MBean。
    2、MBean頁面,點擊Agent頁面中的某個MBean可以進入該MBean頁面。我們點擊第一個name=helloWorld1的MBean,顯示有一下幾個信息:
        a)、MBean註冊時提供的ObjectName,HelloAgent:name=helloWorld1
        b)、類的名字,在這個例子中是HelloWorld。
        c)、描述,對於Stand MBean,描述有MBean Server創建。
        d)、屬性列表,MBean暴露的屬性列表,這個MBean有一個屬性Greeting是個可讀寫屬性(RW,因為有getter和setter),你可以在Value列的文本框中輸入字符串,點擊Apply,就動態設置瞭Greeting的值。
        e)、暴露的操作列表,這個MBean有一個操作printGreeting,點擊printGreeting按鈕可以調用該操作,會顯示”printGreeting Successful“的信息,在控制臺可以看到打印出瞭你剛才輸入的Greeting屬性的值。
        f)、Reload Period,指的是MBean Server是否要重新實例化這個MBean,如果是,多久一次。
        g)、Unregister按鈕,反註冊這個MBean。
    本例中還有一個MBean,就是Html適配器,因為它也在Agent註冊瞭成為一個MBean.
    3、Admin頁面,點擊Agent頁面的Admin按鈕就進入瞭Admin頁面。通過這個頁面可以增加或者刪除MBean,頁面上有4個文本框分別如下:
        a)、Domain-顯示瞭當前Agent的Domain,
        b)、Keys,也就是ObjectName類的屬性串。
        c)、Java Class,想創建的MBean的完整類名。
        d)、Class Loader,這個是可選的,其他都是必須的。
        在Action選項框下面有一個Constructors選項,如果選瞭這個,點擊Send Request,就會顯示MBean的所有構造器,可以使用其中的一個來創建MBean實例瞭。


    MBean通知
    加入通知代碼到HelloWorld的MBean,JMX提供瞭兩種方法使MBean可以作為其他MBean的監聽對象。第一種是實現javax.management.NotificationBroadcaster接口,第二種時繼承javax.management.NotificationBroadcasterSupport類。
    實現接口的好處是你還可以繼承其他類,繼承類的好處是你不需要寫實現接口的方法代碼。我們選擇使用繼承類的方法,HelloWorld類代碼修改成如下:
     public class HelloWorld extends NotificationBroadcasterSupport implements HelloWorldMBean {
    public HelloWorld() {
        this.greeting = “Hello World! I

發佈留言