JMX 代理 Servlet 是一款輕量級(jí)的代理。它的用途對(duì)用戶來(lái)說(shuō)并不是特別友好,但是其 UI 卻非常有助于整合命令行腳本,從便于監(jiān)控和改變 Tomcat 的內(nèi)部運(yùn)行。
通過(guò)這個(gè)代理,我們可以獲取和設(shè)置信息。要想真正了解 JMX 代理 Servlet,首先應(yīng)該大概了解 JMX。
如果不知道 JMX 的基本原理,那有些內(nèi)容就很難理解了。
JMX 的查詢命令格式如下所示:
http://webserver/manager/jmxproxy/?qry=STUFFSTUFF 是所要執(zhí)行的 JMX 查詢。比如,可以執(zhí)行以下這些查詢:
需要實(shí)際地試驗(yàn)一下才能真正理解這些功能。如果沒(méi)有提供 qry 參數(shù),則將顯示全部的 MBean。我們強(qiáng)烈建議你去閱讀 Tomcat 源代碼,真正了解 JMX 規(guī)范,更好地掌握所有能夠執(zhí)行的查詢。
JMXProxyServlet 還支持一種 get 命令來(lái)獲取特定 MBean的屬性值。該命令的一般格式如下所示:
http://webserver/manager/jmxproxy/get=BEANNAME&att=MYATTRIBUTE&key=MYKEY
必須提供如下參數(shù):
如果命令成功執(zhí)行,則一切正常,否則就會(huì)返回一個(gè)出錯(cuò)消息。舉兩個(gè)例子,比如當(dāng)希望獲取當(dāng)前的堆內(nèi)存數(shù)據(jù)時(shí),可以采用如下命令:
http://webserver/manager/jmxproxy/?get=java.lang:type=Memory&att=HeapMemoryUsage
再或者,如果只希望獲取“用過(guò)的”鍵,可以采用如下命令:
http://webserver/manager/jmxproxy/?get=java.lang:type=Memory&att=HeapMemoryUsage&key=used
上面介紹了如何查詢一個(gè) MBean。下面來(lái)看看 Tomcat 的內(nèi)部運(yùn)行吧!set 命令的一般格式為:
http://webserver/manager/jmxproxy/?set=BEANNAME&att=MYATTRIBUTE&val=NEWVALUE
需要提供三個(gè)請(qǐng)求參數(shù):
如果命令成功執(zhí)行,則一切正常,否則就會(huì)返回一個(gè)出錯(cuò)消息。比如,假如想為 ErrorReportValve 進(jìn)行立即調(diào)試,可以將屬性 debug 設(shè)為 10:
http://localhost:8080/manager/jmxproxy/
?set=Catalina%3Atype%3DValve%2Cname%3DErrorReportValve%2Chost%3Dlocalhost
&att=debug&val=10
所得結(jié)果如下(你的有可能不同):
Result: ok
下面來(lái)看看如果傳入一個(gè)不恰當(dāng)數(shù)值時(shí)的情況,比如使用一個(gè)URL,并試圖將屬性 debug 設(shè)置為 'cow'。
http://localhost:8080/manager/jmxproxy/
?set=Catalina%3Atype%3DValve%2Cname%3DErrorReportValve%2Chost%3Dlocalhost
&att=debug&val=cow
運(yùn)行結(jié)果如下:
Error: java.lang.NumberFormatException: For input string: "cow"
使用 invoke 命令,我們就可以在 MBean 中調(diào)用方法。該命令的一般格式為:
http://webserver/manager/jmxproxy/
?invoke=BEANNAME&op=METHODNAME&ps=COMMASEPARATEDPARAMETERS
比如,使用如下方式來(lái)調(diào)用 Service 的 findConnectors() 方法:
http://localhost:8080/manager/jmxproxy/
?invoke=Catalina%3Atype%3DService&op=findConnectors&ps=