hengheng123456789

            BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
            297 Posts :: 68 Stories :: 144 Comments :: 0 Trackbacks
          ?一、JMX簡(jiǎn)介

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

            我們還是從JMX能給我們提供什么好處入手來(lái)理解吧。舉一個(gè)應(yīng)用實(shí)例:在一個(gè)系統(tǒng)中常常會(huì)有一些配置信息,比如服務(wù)的IP地址,端口號(hào)什么的,那么如何來(lái)寫這些代碼呢?

          ?? 1. 程序初哥一般是寫死在程序里,到要改變時(shí)就去改程序,然后再編譯發(fā)布;
          ?? 2. 程序熟手則一般把這些信息寫在一個(gè)配置文件里(JAVA一般都是*.properties文件),到要改變時(shí)只要改配置文件,但還是重新啟動(dòng)系統(tǒng),以便讀取配置文件里的新值;
          ?? 3. 程序好手則會(huì)寫一個(gè)段代碼,把配置值緩存起來(lái),系統(tǒng)在讀值的時(shí)候,先看看配置文件有沒(méi)有更動(dòng)。如有更改則重讀一遍,否則從緩存里讀取值
          ?? 4. 程序高手則懂得取物為我所用,用JMX!把配置屬性集中在一個(gè)類,然后寫一個(gè)叫MBean的東東,再配置一下就輕松搞定了。而且JMX自動(dòng)提供了一個(gè)WEB頁(yè)面來(lái)給你來(lái)改變這些配置信息。

          二、準(zhǔn)備工作


            JMX是一份規(guī)范,SUN依據(jù)這個(gè)規(guī)范在JDK(1.3、1.4、5.0)提供了JMX接口。而根據(jù)這個(gè)接口的實(shí)現(xiàn)則有很多種,比如Weblogic的JMX實(shí)現(xiàn)、MX4J、JBoss的JMX實(shí)現(xiàn)。在SUN自己也實(shí)現(xiàn)了一份,不過(guò)在JDK1.4之前,這件JMX實(shí)現(xiàn)(一些JAR包)是可選的,你得去它的網(wǎng)站上下載。JDK5.0則內(nèi)嵌了進(jìn)來(lái),安裝JDK5.0就可以開(kāi)發(fā)基于JMX的代碼了。
            但JDK5.0并非包含所有SUN的關(guān)于JMX的代碼,有一些工具類是排除在JDK5.0之外的。下面根據(jù)所使用的JDK版本情況,談一談開(kāi)發(fā)環(huán)境的準(zhǔn)備。
          1、JDK1.3、1.4
            去SUN網(wǎng)站下載SUN的JMX實(shí)現(xiàn),共兩個(gè)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下用命令行開(kāi)發(fā),則把這五個(gè)JAR包加入到classpath系統(tǒng)變量中。如果你用Eclipse開(kāi)發(fā),則把JAR包加入到項(xiàng)目屬性的Libratries(庫(kù))引用中。
          2、JDK5.0
            JDK5.0的jre\lib\rt.jar已經(jīng)包含了jmxri.jar、jmxremote.jar、rmissl.jar三個(gè)包的代碼。如果你用到j(luò)mxtools.jar、jmxremote_optional.jar的類,則需要將這兩個(gè)類加入到classpath或 Eclipse的項(xiàng)目庫(kù)引用中。
          3、我使用的開(kāi)發(fā)環(huán)境:JDK5.0 + Eclipse3.2。
            注:因?yàn)橛玫絡(luò)mxtools.jar中的HtmlAdaptorServer類,所以將此包加入到項(xiàng)目庫(kù)引用中。jmxremote_optional.jar暫時(shí)不用到,不管它。

          三、HelloWorld實(shí)例
          1、Hello是一個(gè)需要被管理的類(普通類)


          /**
          ?* @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)建一個(gè)相應(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);
          }

          ?? ??? ??? ??? ??? ??? ??? ?

          說(shuō)明:包含在MBean中方法都將是可以被管理的。MBean起名是有規(guī)范的,就是原類名后加上MBean字樣。
           
          3、創(chuàng)建一個(gè)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.....");

          ??? }
          }


          說(shuō)明:

          ??? * 先創(chuàng)建了一個(gè)MBeanServer,用來(lái)做MBean的容器
          ??? * 將Hello這個(gè)類注入到MBeanServer中,注入需要?jiǎng)?chuàng)建一個(gè)ObjectName類
          ??? * 創(chuàng)建一個(gè)AdaptorServer,這個(gè)類將決定MBean的管理界面,這里用最普通的Html型界面。AdaptorServer其實(shí)也是一個(gè)MBean。
          ??? * chengang:name=HelloWorld的名字是有一定規(guī)則的,格式為:“域名:name=MBean名稱”,域名和MBean名稱都可以任意取。

          4、運(yùn)行HelloAgent,然后打開(kāi)網(wǎng)頁(yè):http://localhost:8082/
          ??? 單擊“name=HelloWorld”鏈接進(jìn)入
          ? ?

          五、總結(jié)

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

          posted on 2006-08-25 10:00 哼哼 閱讀(5142) 評(píng)論(3)  編輯  收藏 所屬分類: JMX

          Feedback

          # re: 1、JMX的Hello World 2011-12-19 20:43 xinyonda
          mark  回復(fù)  更多評(píng)論
            

          # re: 1、JMX的Hello World 2015-11-04 20:23 qeqe
          131313  回復(fù)  更多評(píng)論
            

          # re: 1、JMX的Hello World 2016-08-02 16:56 袁良錠
          就是找jdmk有點(diǎn)麻煩。  回復(fù)  更多評(píng)論
            

          主站蜘蛛池模板: 射洪县| 铜川市| 军事| 连云港市| 家居| 绵阳市| 克山县| 新密市| 出国| 丰镇市| 中超| 丰台区| 富蕴县| 鄱阳县| 黑水县| 东兴市| 惠州市| 富宁县| 伊川县| 临沭县| 文登市| 南和县| 邯郸县| 高雄县| 芦山县| 永丰县| 健康| 通许县| 凉山| 滕州市| 临夏县| 新建县| 高雄市| 资兴市| 会宁县| 永修县| 麻城市| 尼勒克县| 凤台县| 山东省| 金山区|