JMX HelloWorld執行個體

來源:互聯網
上載者:User

原文地址:http://qun.51.com/bc123/topic.php?pid=4525

例子可以運行 

 

什麼是JMX?在一篇網文中是這樣說的:"JMX(Java Management Extensions)是一個為應用程式植入管理功能的架構。JMX是一套標準的代理和服務,實際上,使用者可以在任何Java應用程式中使用這些代理和服務實現管理",這句話我現在看著還是不知所云,雲裡霧裡。

  我們還是從JMX能給我們提供什麼好處入手來理解吧。舉一個應用執行個體:在一個系統中常常會有一些配置資訊,比如服務的IP地址,連接埠號碼什麼的,那麼如何來寫這些代碼呢?
程式初哥一般是寫死在程式裡,到要改變時就去改程式,然後再編譯發布;
程式熟手則一般把這些資訊寫在一個設定檔裡(JAVA一般都是*.properties檔案),到要改變時只要改設定檔,但還是重新啟動系統,以便讀取設定檔裡的新值;
程式好手則會寫一個段代碼,把配置值緩衝起來,系統在讀值的時候,先看看設定檔有沒有更動。如有更改則重讀一遍,否則從緩衝裡讀取值
程式高手則懂得取物為我所用,用JMX!把配置屬性集中在一個類,然後寫一個叫MBean的東東,再配置一下就輕鬆搞定了。而且JMX自動提供了一個WEB頁面來給你來改變這些配置資訊。
二、準備工作

  JMX是一份規範,SUN依據這個規範在JDK(1.3、1.4、5.0)提供了JMX介面。而根據這個介面的實現則有很多種,比如Weblogic的JMX實現、MX4J、JBoss的JMX實現。在SUN自己也實現了一份,不過在JDK1.4之前,這件JMX實現(一些JAR包)是可選的,你得去它的網站上下載。JDK5.0則內嵌了進來,安裝JDK5.0就可以開發基於JMX的代碼了。

  但JDK5.0並非包含所有SUN的關於JMX的代碼,有一些工具類是排除在JDK5.0之外的。下面根據所使用的JDK版本情況,談一談開發環境的準備。
1、JDK1.3、1.4
  去SUN網站下載SUN的JMX實現,共兩個ZIP檔案,下載網址:http://java.sun.com/products/JavaManagement/download.html。
(1)jmx-1_2_1-ri.zip
   解壓後的lib目錄包含:jmxri.jar、jmxtools.jar
(2)jmx_remote-1_0_1_03-ri.zip
   解壓後的lib目錄包含:jmxremote.jar、jmxremote_optional.jar、rmissl.jar
  如果在DOS下用命令列開發,則把這五個JAR包加入到classpath系統變數中。如果你用Eclipse開發,則把JAR包加入到項目屬性的Libratries(庫)引用中。
2、JDK5.0
  JDK5.0的jre/lib/rt.jar已經包含了jmxri.jar、jmxremote.jar、rmissl.jar三個包的代碼。如果你用到jmxtools.jar、jmxremote_optional.jar的類,則需要將這兩個類加入到classpath或Eclipse的項目庫引用中。
3、我使用的開發環境:JDK5.0 + Eclipse3.2。
  註:因為用到jmxtools.jar中的HtmlAdaptorServer類,所以將此包加入到項目庫引用中。jmxremote_optional.jar暫時不用到,不管它。

三、HelloWorld執行個體
1、Hello是一個需要被管理的類(普通類)

/** * @author ChenGang 2005-12-3 */ public class Hello implements HelloMBean { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public void printHello() { System.out.println("Hello World, " + name); } public void printHello(String whoName) { System.out.println("Hello , " + whoName); }}

2、要管理Hello則必須建立一個相應MBean,如下:
/** * @author ChenGang 2005-12-3 */ public interface HelloMBean { public String getName(); public void setName(String name); public void printHello(); public void printHello(String whoName);}

說明:包含在MBean中方法都將是可以被管理的。MBean起名是有規範的,就是原類名後加上MBean字樣。
 
3、建立一個Agent類
import javax.management.MBeanServer;import javax.management.MBeanServerFactory;import javax.management.ObjectName;import com.sun.jdmk.comm.HtmlAdaptorServer;
public class HelloAgent {
public static void main(String[] args) throws Exception { MBeanServer server = MBeanServerFactory.createMBeanServer();
ObjectName helloName = new ObjectName("chengang:name=HelloWorld"); server.registerMBean(new Hello(), helloName);
ObjectName adapterName = new ObjectName("HelloAgent:name=htmladapter,port=8082"); HtmlAdaptorServer adapter = new HtmlAdaptorServer(); server.registerMBean(adapter, adapterName);
adapter.start(); System.out.println("start....."); }}

說明:
先建立了一個MBeanServer,用來做MBean的容器
將Hello這個類注入到MBeanServer中,注入需要建立一個ObjectName類
建立一個AdaptorServer,這個類將決定MBean的管理介面,這裡用最普通的Html型介面。AdaptorServer其實也是一個MBean。
chengang:name=HelloWorld的名字是有一定規則的,格式為:“網域名稱:name=MBean名稱”,網域名稱和MBean名稱都可以任意取。
4、運行HelloAgent,然後開啟網頁:http://localhost:8082/,如下:

單擊“name=HelloWorld”連結進入,出現如下頁面

依照下面紅線的步驟操作之後,在控制台(我用Eclipse就是console視圖)得到如下輸出:

五、總結

  在實際系統中我們可以把name變成決定數庫連結池的變數,這樣我就可以對系統的運行參數進行實現的監控和配置(管理)。而且也可以對一些方法(如printHello)進行遠程調用了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.