一文詳解tomcat中的jmx監(jiān)控
1.概述
本文我們將從使用和源碼實(shí)現(xiàn)兩個(gè)方面聊一下jmx的落地實(shí)現(xiàn)范例——tomcat中的jmx。
tomcat作為一個(gè)web server,其選用jmx來實(shí)現(xiàn)監(jiān)控功能。之所以選擇jmx是因?yàn)閖mx是java se原生的能力,不需要第三方依賴,在web server這種基礎(chǔ)組件中,選用原生的技術(shù)可以避免很多三方依賴帶來的不便。
2.如何開啟tomcat的JMX
jmx是由JVM來支持實(shí)現(xiàn)的標(biāo)準(zhǔn),所以開啟jmx本質(zhì)上就是通過配置啟動(dòng)參數(shù)的方式來實(shí)現(xiàn)的,例如,以下是一個(gè)簡單的 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.jar
tomcat本質(zhì)也是個(gè)Java程序,所以也是通過配置啟動(dòng)參數(shù)來開啟jmx的。本文是基于Windows環(huán)境來配置的,Linux環(huán)境其實(shí)也大差不差。配置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
然后啟動(dòng)tomcat,打開jconsole:
連接上我們啟動(dòng)的這個(gè)tomcat,MBean列表里面可以看到tomcat的所有MBean,對tomcat源碼熟悉的讀者會(huì)發(fā)現(xiàn),tomcat的核心組件都以MBean的方式被注冊進(jìn)JMX Server中了。
3.tomcat如何實(shí)現(xiàn)JMX的源碼分析
首先博主去github上下載了tomcat7.0.105版本的源碼。前面我們聊過jmx,要使用jmx,就要先注冊相關(guān)的MBean。tomcat里面有一個(gè)jmxEnabled接口,這個(gè)接口就是用來實(shí)現(xiàn)MBean的注冊的。它定義了兩個(gè)方法,一個(gè)用來注冊MBean,一個(gè)用來卸載MBean。
這個(gè)接口的實(shí)現(xiàn)類是LifecycleMBeanBase,這個(gè)類里實(shí)現(xiàn)了注冊和卸載MBean的方法。對tomcat源碼有了解的讀者對這個(gè)類會(huì)很熟悉(當(dāng)然不了解也別怕),LifecycleMBeanBase這個(gè)類是tomcat中用來管理各個(gè)組件的生命周期的,也就是說這個(gè)組件里會(huì)實(shí)現(xiàn)一些在各個(gè)組件初始化或者銷毀的時(shí)候要做的額外動(dòng)作。
來我們好好讀一下這里的源碼:
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)文章
解決tomcat部署下的web項(xiàng)目網(wǎng)頁更改不能自動(dòng)刷新的問題
下面小編就為大家?guī)硪黄鉀Qtomcat部署下的web項(xiàng)目網(wǎng)頁更改不能自動(dòng)刷新的問題。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-06-06項(xiàng)目啟動(dòng)tomcat失敗的幾種可能原因和解決方法(小結(jié))
本文主要介紹了項(xiàng)目啟動(dòng)tomcat失敗的幾種可能原因和解決方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04Maven3.8.1使用Tomcat8插件啟動(dòng)項(xiàng)目的方法(親測有效)
在本地maven的settings.xml文件中添加阿里云鏡像,然后在pom.xml文件中添加tomcat8插件的配置,重新下載依賴,運(yùn)行tomcat8:run命令,成功啟動(dòng)項(xiàng)目,本文介紹Maven3.8.1使用Tomcat8插件啟動(dòng)項(xiàng)目的方法,感興趣的朋友一起看看吧2024-11-11Tomcat弱口令復(fù)現(xiàn)及利用(反彈shell)
本文主要介紹了Tomcat弱口令復(fù)現(xiàn)及利用(反彈shell),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05Tomcat實(shí)現(xiàn)session共享(session 會(huì)話復(fù)制)
這篇文章主要介紹了Tomcat實(shí)現(xiàn)session共享,其實(shí)就是session 會(huì)話復(fù)制的相關(guān)方法,需要的朋友可以參考下2017-09-09