上一篇文章在談Intellij IDEA使用Tomat應(yīng)用部署的實(shí)現(xiàn)方式時(shí),講到其是通過操作Tomcat的MBeanServer璃吧,動(dòng)態(tài)添加Context,實(shí)現(xiàn)應(yīng)用的啟動(dòng)與部署废境。(可以通過查看歷史消息中你一定不知道IDE里的Tomcat是怎么工作的了解詳細(xì)內(nèi)容)
這一篇畜挨,我們來詳細(xì)說一下Tomcat中的MBeanServer。
- JMX(Java Management Extensions)
說到MBeanServer彬坏,就不得不提JMX。JMX是用于管理和監(jiān)控JAVA應(yīng)用的接口規(guī)范膝晾。同時(shí)具有以下特點(diǎn):
通過JMX的”MBeans“來讀取數(shù)據(jù)
可以讀取和寫入MBean的屬性
可以執(zhí)行MBean的方法
我們都熟悉JAVA中的反射栓始,而JMX的整體實(shí)現(xiàn)和作用,和反射有很大的相似性血当。只是JMX允許執(zhí)行遠(yuǎn)程主機(jī)上的目標(biāo)方法幻赚。
通過JMX,可以輕松獲取JVM的各項(xiàng)數(shù)據(jù)值臊旭,例如GC執(zhí)行次數(shù)落恼,當(dāng)前JVM使用的GC類型,內(nèi)存占用离熏,GC暫停的時(shí)間等佳谦。
在此之上,Tomcat對(duì)外暴露了許多有用的數(shù)據(jù)滋戳,可以通過JMX獲取具體通道的連接數(shù)據(jù)钻蔑,請(qǐng)求數(shù),響應(yīng)數(shù)奸鸯,失敗的請(qǐng)求有多少咪笑,線程池的數(shù)據(jù),JNDI的數(shù)據(jù)等等娄涩。
在JMX中窗怒,有三個(gè)關(guān)鍵的概念:
MBeanServer
ObjectName
MBean
其中MBeanServer代表具體要操作的服務(wù)器,類似于我們要訪問哪個(gè)網(wǎng)站。
而ObjectName代表MBeanServer注冊(cè)的特定對(duì)象的名稱扬虚,就像網(wǎng)站的某個(gè)特定頁面名字努隙。后續(xù)的屬性獲取,方法執(zhí)行孔轴,都是在指定特定的ObjectName之后獲取到MBean對(duì)象剃法,再對(duì)其具體的屬性和方法進(jìn)行執(zhí)行。
如上圖路鹰,在連接Tomcat的MBeanServer后贷洲,可以看到左側(cè)樹狀的MBeans。紅框內(nèi)代表常用的8080通道的MBean晋柱,其對(duì)應(yīng)的ObjectName是Catalina:type=Connector,port=8080优构。
以上兩張圖,代表該MBean對(duì)應(yīng)的對(duì)外提供的屬性和可以操作的方法雁竞。
對(duì)應(yīng)的方法钦椭,可以查看其方法簽名,是否需要傳遞參數(shù)碑诉,各參數(shù)類型等彪腔。
Tomcat內(nèi)部,在啟動(dòng)時(shí)进栽,會(huì)將許多核心的數(shù)據(jù)德挣,通過MBean的方式,注冊(cè)到MBeanServer上快毛,方便進(jìn)行監(jiān)控和管理格嗅。
了解了基本概念后,我們以上篇文章提到的例子唠帝,來具體看下JMX在Tomcat中的作用屯掖。
啟動(dòng)Tomcat,使用jps命令獲取其對(duì)應(yīng)的PID
使用jconsole襟衰,連接到該Tomcat對(duì)應(yīng)的MBeanServer上贴铜。
查看該MBeanServer對(duì)應(yīng)的ObjectName都有哪些,選擇具體要操作的對(duì)象瀑晒。
由于通過Intellij IDEA在啟動(dòng)Tomcat應(yīng)用部署時(shí)的棧調(diào)用阀湿,可以得知其調(diào)用的ObjectName對(duì)應(yīng)的類是MBeanFactory.
TCP Connection(2)-127.0.0.1@1379 daemon, prio=5, in group 'RMI Runtime', status: 'RUNNING' at org.springframework.web.context.ContextLoaderListener.<init>(ContextLoaderListener.java:98) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:725) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:701) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717) at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1585) at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:463) at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:413) at sun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethodAccessorImpl.java:-1) at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1466) at java.lang.Thread.run(Thread.java:745)
所
查看該類對(duì)應(yīng)的MBean,
再查看IDEA操作的該MBean的名為createStandContext的方法瑰妄,如下圖陷嘴。此方法需要三個(gè)String類型的參數(shù),基本和直接在server.xml中配置Context元素是一致的间坐。
經(jīng)過上面的分析灾挨,IDEA內(nèi)部Tomcat應(yīng)用部署的核心原理我們已經(jīng)了解邑退。而順便了解了JMX。后面的文章有機(jī)會(huì)再聊一下具體項(xiàng)目中對(duì)其使用劳澄。