熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

Spring1.2rc1中jmx支持的一些答疑

2013-11-23 20:04:26  來源: Java開源技術 

  jmx是什麼?
  
  jmx是java下的資源管理規范泛指的資源可以代表任何對象和事務如網絡設備應用程序在這裡我們特指javabean
  
  jmx可以干什麼?
  
  通過jmx可以在程序運行期改變資源的配置和狀態啟動或者停止服務對應著javabean就是調用setter設置新的屬性值調用bean上的方法完成某些功能比如關閉原來的數據庫連接設置一個新的數據庫url然後啟動新的數據庫連接這些都是運行期的操作不需要你停止服務器當然你完全可以自己編碼自己實現對bean配置的管理事實上如果不使用jmx也可以達到配置的目的不過使用jmx後可以作的更專業點
  
  jmx在使用上的結構是怎麼樣的?
  
  jmx最新的規范是從使用上來說jmx分為兩部分服務端和客戶端被管理的資源注冊到服務端服務端可以開放某些協議和接口客戶端通過某種方式連接到服務端根據協議執行某些操作使得服務端更改資源的配置和狀態
  
  當然上面這種說法是很粗糙的具體的細節可以查看jmx規范
  
  spring和jmx集成有什麼作用?
  
  spring的最主要功能是進行ioc裝配而這個裝配相對來說是靜態的一旦程序啟動就需要通過其他手段來更改bean的屬性jmx就是運行時改變配置的一種方法
  
  spring是怎麼集成jmx的?
  
  spring對jmx的集成體現在兩個方面
  
  一方面如果你處於編寫客戶端代碼的情況spring提供了orgspringframeworkjmxaccess 包使得你可以很容易的同Server連接實現管理代碼
  
  另一方面spring提供了orgspringframeworkjmxexport 包使得你不用編寫任何代碼就可以將spring下管理的bean作為jmx資源注冊到server中下面我們只討論export
  
  jmx中經常提到的MBean是什麼?
  
  MBean就是被jmx管理的資源一般有兩種類型的MBean標准的和動態的
  
  標准類型的MBean最簡單它能管理的資源(包括屬性方法時間)必須定義在接口中然後MBean必須實現這個接口它的命名也必須遵循一定的規范例如我們的MBean為Hello則接口必須為HelloMBean
  
  動態MBean必須實現javaxmanagementDynamicMBean接口所有的屬性方法都在運行時定義
  
  Spring的export 支持那種類型的bean?我的javabean必須符合jmx規范麼?
  
  Spring支持把任何一種bean作為MBean如果這個javabean本身就是按照jmx規范設計的MBeanspring會簡單的把他注冊到jmx server中如果這個bean不是MBean那麼spring會動態創建一個MBean(事實上是一個model MBean)再把原先的這個bean設置到這個新創建的MBeanjmx server通過這個MBean間接的管理對應的資源
  
  如果不用spring我可以使用jmx麼?
  
  當然可以不過使用spring你可以簡單的和現有系統集成你不需要編寫一行代碼就能將你的應用建立在jmx基礎上
  
  你說的都很好我也決定使用spring對jmx的集成了那麼我怎麼開始?
  
  首先你要下載spring版本接著要找到jmx的某個實現如果你使用的是jdk那麼你已經內置了jmx功能如果你使用的是更低的版本那麼你需要下載一個jmx的實現一般有兩個選擇下載sun的參考實現或者找一個更專業的實現比如mxj
  
  下面我以sun參考實現為例子
  
  spring中怎麼配置jmx export?
  
  java代碼:
  
  <?xml version= encoding=UTF?>
  <!DOCTYPE beans PUBLIC //SPRING//DTD BEAN//EN beansdtd>
  
  <beans>
  <bean id=jmxMBeanExport class=orgspringframeworkjmxexportMBeanExporter>
  <property name=server>
  <bean class=javaxmanagementMBeanServerFactory factorymethod=createMBeanServer/>
  </property>
  <property name=beans>
  <map>
  <entry key=MyAgent:name=htmladapterport=>
  <bean class=mHtmlAdaptorServer initmethod=start>
  <property name=port>
  <value></value>
  </property>
  </bean>
  </entry>
  
  </map>
  </property>
  </bean>
  
  </beans>
  
  將這個applicationContext啟動起來然後在浏覽器中打//localhost:/你應該能看到一個jmx的管理界面
  
  配置文件中的HtmlAdaptorServer有雙重身份首先他是一個MBean被jmx server管理其次他對外打開了一個接口可以通過他管理jmx我們稱這種MBean為Protocol adapters 或者connectors
  
  事實上HtmlAdaptorServer的是放在jmxtoolsjar中的你也可以在其他jmx實現上(比如mxj的Server)也使用這個Adaptor這就是使用jmx的優勢有一個統一的管理平台可以使用任何一種和標准兼容的管理工具
  
  我如何將自己的bean export出來?
  
  很簡單只需要多一行entry就可以了比如java代碼:
  
  <entry key=MyAgent:name=hello>
  <ref bean=hello/>
  </entry>
  
  Spring怎麼知道要把我的bean中的哪些屬性和方法暴露出來?
  
  Spring其實不知道如果你不作任何配置那麼他會采用一種很極端的方式所有的getter/setter都作為jmx中的屬性所有的public方法都作為jmx中的方法但是從Object下繼承來的會被屏蔽所以你不會在jmx中看到toString這個方法
  
  事實上spring是通過MBeanInfoAssembler來獲取資源信息的默認情況下他用的是SimpleReflectiveMBeanInfoAssembler如果你有定制的要求那麼可以用其他的MBeanInfoAssembler
  
  我看到了orgspringframeworkjmxexportannotation這個好像是jdk annotations 用的我也必須使用jdk麼?
  
  orgspringframeworkjmxexportannotation下的這些類是確實配合annotation用的上面說過如果要定制暴露給jmx中的屬性和方法那麼需要使用其他的MBeanInfoAssembler其中一種方法是利用annotations不過如果你不用到annotation就不需要使用jdkannotations只是一個可選項
  
  jmx和spring不能作什麼?
  
  即使你用了jmx和spring也有很多是他們不能完成的功能比如他們不能直接幫助你向老板要求加薪不能阻止某些國家對海峽的干涉更不能協助人類探索火星……
  
  好了回到正題jmx和spring只是協助你完成某些功能而且這些功能相對來說還是很有限的首先jmx中可被管理的屬性只能是一些簡單類型比如數字或者字符其次jmx也不能自動幫你把修改後的屬性保存起來所以如果你自己不寫特定的代碼下次程序啟動後還是原始的配置不過不管怎麼說有了spring和jmx畢竟生活更美好了些
From:http://tw.wingwit.com/Article/program/Java/ky/201311/27902.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.