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