Crawling Dialy

          常用鏈接

          統(tǒng)計(jì)

          最新評(píng)論

          JMX學(xué)習(xí)-2

          最近覺(jué)得需要在設(shè)計(jì)方面多下些功夫,可能最近一段時(shí)間太過(guò)于沉溺于技術(shù)的細(xì)節(jié)了,所以準(zhǔn)備把項(xiàng)目程序的Design細(xì)致的分析一下。有時(shí)間的話把那本Head First Design Pattern看一下。
          忘記說(shuō)了這個(gè)專題介紹的JMX是JDK5.0時(shí)候的標(biāo)準(zhǔn),6.0好像有很多變動(dòng),這里不會(huì)介紹。
          接著上次的繼續(xù)……
          其實(shí)在這個(gè)專題中我不想把JMX這門技術(shù)面面俱到,也不想太鉆到細(xì)節(jié)里面,只是想寫一些個(gè)人對(duì)這個(gè)技術(shù)的理解,一個(gè)是對(duì)學(xué)習(xí)的一個(gè)檢驗(yàn),另外其一個(gè)備忘的作用。
          ?上一次說(shuō)到了JMX分三個(gè)層次,分別是:基礎(chǔ)部件,代理,發(fā)布。下面分別介紹這三個(gè)層次。
          1,基礎(chǔ)構(gòu)件(MBean)
          每一個(gè)MBean有兩個(gè)部分組成,其中一個(gè)是后綴名為MBean的interface,另外一個(gè)是實(shí)現(xiàn)了這個(gè)接口的類,這點(diǎn)和EJB2.0很相似。我認(rèn)為相似的原因是他們都是可以遠(yuǎn)程調(diào)用的,所以客戶端只需要拿到那個(gè)實(shí)現(xiàn)了interface的Object就好了,不需要知道這個(gè)Object里面究竟是如何實(shí)現(xiàn)的。一個(gè)MBean的interface是用來(lái)定義暴露給MBeanServer的方法和屬性的,其中暴露的屬性是通過(guò)setter和getter方法來(lái)實(shí)現(xiàn)的,這個(gè)是符合JavaBean的規(guī)范的。MBean的Class則是實(shí)現(xiàn)這個(gè)interface,向外界提供具體的服務(wù),這個(gè)Class的名字必須是那個(gè)接口MBean后綴的前部分。
          還有一中MBean是DynamicMBean,這種MBean不需要?jiǎng)?chuàng)建接口,只需要實(shí)現(xiàn)DynamicMBean這個(gè)接口就行了。這種MBean的作用就是可以通過(guò)反射的機(jī)制自定義暴露的方法,屬性,通知,而不使用MBeanServer提供的默認(rèn)的訪問(wèn)規(guī)則。
          還有就是Notification,這個(gè)理解起來(lái)很簡(jiǎn)單就不講了。
          2,代理層(MBeanServer)
          代理層其實(shí)是管理MBean的容器,容器里面的MBean通過(guò)MBeanServer向外界提供服務(wù),所以這層叫做代理層。
          一個(gè)MBeanServer通過(guò)如下的工廠方法創(chuàng)建:
          MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
          MBean可以注冊(cè)到這個(gè)MBeanServer:
          ?
          ????? ObjectName name = new ObjectName("com.example.mbeans:type=Hello");?
          ????? Hello mbean = new Hello();?
          ????? mbs.registerMBean(mbean, name);
          ?
          ObjectName是從容器中取出這個(gè)MBean的Key。一個(gè)MBeanServer中不能注冊(cè)兩個(gè)相同的ObjectName。
          MBeanServer基本上是通過(guò)反射機(jī)制來(lái)訪問(wèn)容器中的MBean的,所以對(duì)外提供的訪問(wèn)方法和反射機(jī)制很相似,基本上就是多了一個(gè)ObjectName的參數(shù)而已,下面列幾個(gè)例子:
          mbs.getAttribute(mbeanObjectName, "State");
          mbs.setAttribute(mbeanObjectName, stateAttribute);
          mbs.invoke(mbeanObjectName, "reset", null, null);
          //TODO?代理層先寫到這里吧,如果以后有需要補(bǔ)充的再加。
          3,發(fā)布層
          所謂發(fā)布層就是外界訪問(wèn)代理層的方法。
          可以通過(guò)如下的方法啟動(dòng)一個(gè)RMI服務(wù)器
          JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:9999/server");
          JMXConnectorServer cs = JMXConnectorServerFactory.newJMXConnectorServer(url, null, mbs);
          Client可以連接到這個(gè)RMI服務(wù)器
          JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:9999/server");
          JMXConnector jmxc = JMXConnectorFactory.connect(url, null);
          MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();
          而MBeanServer就是繼承自MBeanServerConntion的,所以他們的大部分方法都一樣或者相似。
          OK,JMX的基本概念就介紹到這里,以后的專題就是關(guān)于JMX的lookup service和JMX的應(yīng)用分析,比如在jboss和glassfish上的應(yīng)用。

          posted on 2007-02-27 23:26 solospider 閱讀(1362) 評(píng)論(0)  編輯  收藏


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 防城港市| 墨脱县| 三门县| 福贡县| 博白县| 大安市| 临泉县| 斗六市| 新密市| 保定市| 镇赉县| 信丰县| 浦城县| 三明市| 聊城市| 邵武市| 武义县| 滁州市| 长治市| 丁青县| 恩施市| 绩溪县| 黄大仙区| 江孜县| 东阿县| 隆林| 廉江市| 伊金霍洛旗| 罗源县| 山丹县| 霍邱县| 墨脱县| 鸡泽县| 淄博市| 洛扎县| 乌恰县| 苏尼特左旗| 宜丰县| 东莞市| 金阳县| 丰都县|