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提供了org
springframework
jmx
access 包
使得你可以很容易的同Server連接實現管理代碼
另一方面
spring提供了org
springframework
jmx
export 包
使得你不用編寫任何代碼
就可以將spring下管理的bean作為jmx資源注冊到server中
下面我們只討論export
jmx中經常提到的MBean是什麼? MBean就是被jmx管理的資源
一般有兩種類型的MBean
標准的和動態的
標准類型的MBean最簡單
它能管理的資源(包括屬性
方法
時間)必須定義在接口中
然後MBean必須實現這個接口
它的命名也必須遵循一定的規范
例如我們的MBean為Hello
則接口必須為HelloMBean
動態MBean必須實現javax
management
DynamicMBean接口
所有的屬性
方法都在運行時定義
Spring的export 支持那種類型的bean?我的javabean必須符合jmx規范麼?
Spring支持把任何一種bean作為MBean
如果這個javabean本身就是按照jmx規范設計的MBean
spring會簡單的把他注冊到jmx server中
如果這個bean不是MBean
那麼spring會動態創建一個MBean(事實上是一個model MBean)
再把原先的這個bean設置到這個新創建的MBean
jmx server通過這個MBean間接的管理對應的資源
如果不用spring我可以使用jmx麼? 當然可以
不過使用spring
你可以簡單的和現有系統集成
你不需要編寫一行代碼
就能將你的應用建立在jmx基礎上
你說的都很好
我也決定使用spring對jmx的集成了
那麼我怎麼開始?
首先你要下載spring
版本
接著要找到jmx的某個實現
如果你使用的是jdk
那麼你已經內置了jmx功能
如果你使用的是更低的版本
那麼你需要下載一個jmx的實現
一般有兩個選擇
下載sun的參考實現或者找一個更
專業
的實現
比如mx
j
下面我以sun參考實現為例子
spring中怎麼配置jmx export?
java代碼:
<?xml version=
encoding=
UTF
?>
<!DOCTYPE beans PUBLIC
//SPRING//DTD BEAN//EN
beans
dtd
>
<beans>
<bean id=
jmxMBeanExport
class=
org
springframework
jmx
export
MBeanExporter
>
<property name=
server
>
<bean class=
javax
management
MBeanServerFactory
factory
method=
createMBeanServer
/>
</property>
<property name=
beans
>
<map>
<entry key=
MyAgent:name=htmladapter
port=
>
<bean class=
m
HtmlAdaptorServer
init
method=
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的是放在jmxtools
jar中的
你也可以在其他jmx實現上(比如mx
j的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
我看到了org
springframework
jmx
export
annotation
這個好像是jdk
annotations 用的
我也必須使用jdk
麼?
org
springframework
jmx
export
annotation下的這些類是確實配合annotation用的
上面說過
如果要定制暴露給jmx中的屬性和方法
那麼需要使用其他的MBeanInfoAssembler
其中一種方法是利用annotations
不過如果你不用到annotation
就不需要使用jdk
annotations只是一個可選項
jmx和spring不能作什麼? 即使你用了jmx和spring
也有很多是他們不能完成的功能
比如他們不能直接幫助你向老板要求加薪
不能阻止某些國家對海峽的干涉
更不能協助人類探索火星……
好了
回到正題
jmx和spring只是協助你完成某些功能
而且這些功能相對來說還是很有限的
首先jmx中可被管理的屬性只能是一些簡單類型
比如數字或者字符
其次jmx也不能自動幫你把修改後的屬性保存起來
所以如果你自己不寫特定的代碼
下次程序啟動後還是原始的配置
不過不管怎麼說
有了spring和jmx
畢竟
生活更美好了些
From:http://tw.wingwit.com/Article/program/Java/ky/201311/27902.html