你了解JMX在Tomcat的应用吗?

简书 · · 83 次点击 · · 开始浏览    

上一篇文章在谈Intellij IDEA使用Tomat应用部署的实现方式时,讲到其是通过操作Tomcat的MBeanServer,动态添加Context,实现应用的启动与部署。(可以通过查看历史消息中你一定不知道IDE里的Tomcat是怎么工作的了解详细内容)

这一篇,我们来详细说一下Tomcat中的MBeanServer

  1. JMX(Java Management Extensions)

说到MBeanServer,就不得不提JMX。JMX是用于管理和监控JAVA应用的接口规范。同时具有以下特点:
通过JMX的”MBeans“来读取数据

可以读取和写入MBean的属性

可以执行MBean的方法

我们都熟悉JAVA中的反射,而JMX的整体实现和作用,和反射有很大的相似性。只是JMX允许执行远程主机上的目标方法。

通过JMX,可以轻松获取JVM的各项数据值,例如GC执行次数,当前JVM使用的GC类型内存占用GC暂停的时间等。

在此之上,Tomcat对外暴露了许多有用的数据,可以通过JMX获取具体通道的连接数据请求数,响应数,失败的请求有多少线程池的数据JNDI的数据等等。

在JMX中,有三个关键的概念:
MBeanServer

ObjectName

MBean

其中MBeanServer代表具体要操作的服务器,类似于我们要访问哪个网站。
而ObjectName代表MBeanServer注册的特定对象的名称,就像网站的某个特定页面名字。后续的属性获取,方法执行,都是在指定特定的ObjectName之后获取到MBean对象,再对其具体的属性和方法进行执行。


如上图,在连接Tomcat的MBeanServer后,可以看到左侧树状的MBeans。红框内代表常用的8080通道的MBean,其对应的ObjectName是Catalina:type=Connector,port=8080



以上两张图,代表该MBean对应的对外提供的属性可以操作的方法


对应的方法,可以查看其方法签名,是否需要传递参数,各参数类型等。
Tomcat内部,在启动时,会将许多核心的数据,通过MBean的方式,注册到MBeanServer上,方便进行监控和管理。

了解了基本概念后,我们以上篇文章提到的例子,来具体看下JMX在Tomcat中的作用。

启动Tomcat,使用jps命令获取其对应的PID

使用jconsole,连接到该Tomcat对应的MBeanServer上。

查看该MBeanServer对应的ObjectName都有哪些,选择具体要操作的对象。

由于通过Intellij IDEA在启动Tomcat应用部署时的栈调用,可以得知其调用的ObjectName对应的类是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)

查看该类对应的MBean,


再查看IDEA操作的该MBean的名为createStandContext的方法,如下图。此方法需要三个String类型的参数,基本和直接在server.xml中配置Context元素是一致的。

经过上面的分析,IDEA内部Tomcat应用部署的核心原理我们已经了解。而顺便了解了JMX。后面的文章有机会再聊一下具体项目中对其使用。

本文来自:简书

感谢作者:简书

查看原文:你了解JMX在Tomcat的应用吗?

83 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传