子在川上曰

            逝者如斯夫不舍晝夜
          隨筆 - 71, 文章 - 0, 評論 - 915, 引用 - 0
          數(shù)據(jù)加載中……

          [JMX一步步來] 1、JMX的Hello World

              文/陳剛 from www.chengang.com.cn at 2005-12-3

          一、JMX簡介

            什么是JMX?在一篇網(wǎng)文中是這樣說的:"JMX(Java Management Extensions)是一個為應(yīng)用程序植入管理功能的框架。JMX是一套標(biāo)準(zhǔn)的代理和服務(wù),實際上,用戶可以在任何Java應(yīng)用程序中使用這些代理和服務(wù)實現(xiàn)管理",這句話我現(xiàn)在看著還是不知所云,云里霧里。

            我們還是從JMX能給我們提供什么好處入手來理解吧。舉一個應(yīng)用實例:在一個系統(tǒng)中常常會有一些配置信息,比如服務(wù)的IP地址,端口號什么的,那么如何來寫這些代碼呢?
          1. 程序初哥一般是寫死在程序里,到要改變時就去改程序,然后再編譯發(fā)布;
          2. 程序熟手則一般把這些信息寫在一個配置文件里(JAVA一般都是*.properties文件),到要改變時只要改配置文件,但還是重新啟動系統(tǒng),以便讀取配置文件里的新值;
          3. 程序好手則會寫一個段代碼,把配置值緩存起來,系統(tǒng)在讀值的時候,先看看配置文件有沒有更動。如有更改則重讀一遍,否則從緩存里讀取值
          4. 程序高手則懂得取物為我所用,用JMX!把配置屬性集中在一個類,然后寫一個叫MBean的東東,再配置一下就輕松搞定了。而且JMX自動提供了一個WEB頁面來給你來改變這些配置信息。

          二、準(zhǔn)備工作


            JMX是一份規(guī)范,SUN依據(jù)這個規(guī)范在JDK(1.3、1.4、5.0)提供了JMX接口。而根據(jù)這個接口的實現(xiàn)則有很多種,比如Weblogic的JMX實現(xiàn)、MX4J、JBoss的JMX實現(xiàn)。在SUN自己也實現(xiàn)了一份,不過在JDK1.4之前,這件JMX實現(xiàn)(一些JAR包)是可選的,你得去它的網(wǎng)站上下載。JDK5.0則內(nèi)嵌了進(jìn)來,安裝JDK5.0就可以開發(fā)基于JMX的代碼了。

            但JDK5.0并非包含所有SUN的關(guān)于JMX的代碼,有一些工具類是排除在JDK5.0之外的。下面根據(jù)所使用的JDK版本情況,談一談開發(fā)環(huán)境的準(zhǔn)備。
          1、JDK1.3、1.4
            去SUN網(wǎng)站下載SUN的JMX實現(xiàn),共兩個ZIP文件,下載網(wǎng)址: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下用命令行開發(fā),則把這五個JAR包加入到classpath系統(tǒng)變量中。如果你用Eclipse開發(fā),則把JAR包加入到項目屬性的Libratries(庫)引用中。
          2、JDK5.0
            JDK5.0的jre\lib\rt.jar已經(jīng)包含了jmxri.jar、jmxremote.jar、rmissl.jar三個包的代碼。如果你用到j(luò)mxtools.jar、jmxremote_optional.jar的類,則需要將這兩個類加入到classpath或Eclipse的項目庫引用中。
          3、我使用的開發(fā)環(huán)境:JDK5.0 + Eclipse3.2。
            注:因為用到j(luò)mxtools.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則必須創(chuàng)建一個相應(yīng)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起名是有規(guī)范的,就是原類名后加上MBean字樣。
           
          3、創(chuàng)建一個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.....");




          }
          }
          說明:
          • 先創(chuàng)建了一個MBeanServer,用來做MBean的容器
          • 將Hello這個類注入到MBeanServer中,注入需要創(chuàng)建一個ObjectName類
          • 創(chuàng)建一個AdaptorServer,這個類將決定MBean的管理界面,這里用最普通的Html型界面。AdaptorServer其實也是一個MBean。
          • chengang:name=HelloWorld的名字是有一定規(guī)則的,格式為:“域名:name=MBean名稱”,域名和MBean名稱都可以任意取。
          4、運行HelloAgent,然后打開網(wǎng)頁:http://localhost:8082/,效果圖如下:
          1133616885971_1841.jpg
          單擊“name=HelloWorld”鏈接進(jìn)入,出現(xiàn)如下頁面
          1133616990271_7574.jpg

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

          1133617125401_8322.jpg

          五、總結(jié)

            在實際系統(tǒng)中我們可以把name變成決定數(shù)庫鏈接池的變量,這樣我就可以對系統(tǒng)的運行參數(shù)進(jìn)行實現(xiàn)的監(jiān)控和配置(管理)。而且也可以對一些方法(如printHello)進(jìn)行遠(yuǎn)程調(diào)用了。

            預(yù)告:下一篇將對JMX進(jìn)行一些介紹,借助本篇的HelloWorld實例來灌輸一些概念。

          作者簡介

          陳剛,廣西桂林人,著作有《Eclipse從入門到精通》
          您可以通過其博客了解更多信息和文章:http://www.chenGang.com.cn

          posted on 2006-03-07 14:29 陳剛 閱讀(24864) 評論(7)  編輯  收藏 所屬分類: JMX

          評論

          # re: [JMX一步步來] 1、JMX的Hello World  回復(fù)  更多評論   

          圖片無法顯示啊!
          2006-08-18 13:14 | 付闊

          # re: [JMX一步步來] 1、JMX的Hello World[未登錄]  回復(fù)  更多評論   

          寫的很清楚,作者思路很清晰!
          2007-11-19 12:30 | david

          # re: [JMX一步步來] 1、JMX的Hello World  回復(fù)  更多評論   

          感動中,現(xiàn)在正在做JEE項目 維護(hù)服務(wù)器和編譯打包的工作
          幫助很大,謝謝樓主,也謝謝樓主的家鄉(xiāng)的美景給我?guī)頍o限美好的回憶
          2008-04-24 21:38 | Azrael

          # re: [JMX一步步來] 1、JMX的Hello World  回復(fù)  更多評論   

          恩,寫的太好了
          2010-07-16 15:18 | jiny

          # re: [JMX一步步來] 1、JMX的Hello World  回復(fù)  更多評論   

          正深入研究 JMX ,感謝樓主辛勤的勞動
          2010-08-12 11:39 | elam

          # re: [JMX一步步來] 1、JMX的Hello World[未登錄]  回復(fù)  更多評論   

          這里, HtmlAdaptorServer adapter = new HtmlAdaptorServer();

          我要寫成 HtmlAdaptorServer adapter = new HtmlAdaptorServer(8082);

          才能訪問頁面.
          2012-08-09 17:03 | Helen

          # re: [JMX一步步來] 1、JMX的Hello World  回復(fù)  更多評論   

          54
          2013-10-07 11:51 | 12
          主站蜘蛛池模板: 肇州县| 济阳县| 湖南省| 利辛县| 乌苏市| 阳春市| 乌海市| 水富县| 沧州市| 莒南县| 阿克陶县| 开封县| 石渠县| 镇宁| 运城市| 黄石市| 化州市| 远安县| 宜阳县| 如皋市| 宁晋县| 永和县| 宜兰县| 大理市| 苍梧县| 平阴县| 清水县| 宜城市| 库尔勒市| 兴山县| 丰原市| 六安市| 贵南县| 荣成市| 额敏县| 阿克| 南陵县| 江都市| 鄂州市| 湛江市| 获嘉县|