一文詳解tomcat中的jmx監(jiān)控
1.概述
本文我們將從使用和源碼實現(xiàn)兩個方面聊一下jmx的落地實現(xiàn)范例——tomcat中的jmx。
tomcat作為一個web server,其選用jmx來實現(xiàn)監(jiān)控功能。之所以選擇jmx是因為jmx是java se原生的能力,不需要第三方依賴,在web server這種基礎(chǔ)組件中,選用原生的技術(shù)可以避免很多三方依賴帶來的不便。
2.如何開啟tomcat的JMX
jmx是由JVM來支持實現(xiàn)的標(biāo)準(zhǔn),所以開啟jmx本質(zhì)上就是通過配置啟動參數(shù)的方式來實現(xiàn)的,例如,以下是一個簡單的 Java 命令,啟用了 JMX 監(jiān)聽,并配置了 JMX 服務(wù)器的地址和端口:
java -Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=9999 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-jar myapplication.jartomcat本質(zhì)也是個Java程序,所以也是通過配置啟動參數(shù)來開啟jmx的。本文是基于Windows環(huán)境來配置的,Linux環(huán)境其實也大差不差。配置Catalina.bat,在Execute The Requested Command下面加上下面的配置:
set JAVA_OPTS=%JAVA_OPTS% -Djava.rmi.server.hostname=192.168.56.1 -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.rmi.port=9999 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
然后啟動tomcat,打開jconsole:

連接上我們啟動的這個tomcat,MBean列表里面可以看到tomcat的所有MBean,對tomcat源碼熟悉的讀者會發(fā)現(xiàn),tomcat的核心組件都以MBean的方式被注冊進JMX Server中了。

3.tomcat如何實現(xiàn)JMX的源碼分析
首先博主去github上下載了tomcat7.0.105版本的源碼。前面我們聊過jmx,要使用jmx,就要先注冊相關(guān)的MBean。tomcat里面有一個jmxEnabled接口,這個接口就是用來實現(xiàn)MBean的注冊的。它定義了兩個方法,一個用來注冊MBean,一個用來卸載MBean。

這個接口的實現(xiàn)類是LifecycleMBeanBase,這個類里實現(xiàn)了注冊和卸載MBean的方法。對tomcat源碼有了解的讀者對這個類會很熟悉(當(dāng)然不了解也別怕),LifecycleMBeanBase這個類是tomcat中用來管理各個組件的生命周期的,也就是說這個組件里會實現(xiàn)一些在各個組件初始化或者銷毀的時候要做的額外動作。

來我們好好讀一下這里的源碼:
protected void initInternal() throws LifecycleException {
// If oname is not null then registration has already happened via
// preRegister().
if (oname == null) {
獲取MBeanServer
mserver = Registry.getRegistry(null, null).getMBeanServer();
//注冊MBean
oname = register(this, getObjectNameKeyProperties());
}
}
//注冊MBean的方法
protected final ObjectName register(Object obj,
String objectNameKeyProperties) {
?
// Construct an object name with the right domain
StringBuilder name = new StringBuilder(getDomain());
name.append(':');
name.append(objectNameKeyProperties);
?
ObjectName on = null;
?
try {
on = new ObjectName(name.toString());
//將自己注冊到MBeanServer中
Registry.getRegistry(null, null).registerComponent(obj, on, null);
} catch (MalformedObjectNameException e) {
log.warn(sm.getString("lifecycleMBeanBase.registerFail", obj, name),
e);
} catch (Exception e) {
log.warn(sm.getString("lifecycleMBeanBase.registerFail", obj, name),
e);
}
?
return on;
}以上就是一文詳解tomcat中的jmx監(jiān)控的詳細(xì)內(nèi)容,更多關(guān)于tomcat jmx監(jiān)控的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Apache Tomcat服務(wù)器版本號隱藏的幾種方法
本文主要介紹了Apache Tomcat服務(wù)器版本號隱藏的幾種方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-01-01
Tomcat安全設(shè)置 win2003 下tomcat權(quán)限限制
Tomcat安全設(shè)置 win2003 下tomcat權(quán)限限制,需要的朋友可以參考下。2011-03-03
Tomcat Server的設(shè)計和實現(xiàn):StandardServer詳解
文章主要介紹了Tomcat中StandardServer的整體類依賴結(jié)構(gòu),通過解析server.xml文件來理解Server的相關(guān)配置屬性及其作用,感興趣的朋友跟隨小編一起看看吧2026-04-04
tomcat雙擊startup.bat一閃而過(閃退)的問題解決
本文主要介紹了tomcat雙擊startup.bat一閃而過(閃退)的問題解決,可能是tomcat找不到你的jdk環(huán)境配置路徑,下面就來介紹一下解決方法,感興趣的可以了解一下2024-05-05

