Tomcat源码分析-JMX(终)
来源:互联网 发布:淘宝回收电脑可靠吗 编辑:程序博客网 时间:2024/06/13 19:53
背景
前几节分析了Tomcat中跟JMX有关的内容,昨天继续分析了JMX的架构图,以及JVM启动JMX的流程,整理出JDK中相关的类图,以巩固对JMX的理解。
架构图
sun公司定义的JMX架构图,百来的图片如下:
纵观上图,以虚线分割,分为三层:
第一层,远程管理层应用,即访问JMX的应用,如jconsole.exe,snmp等。
第二层,JMX代理层,核心层,它是连接第一层和第三层的枢纽。
第三层,资源植入层,即定义资源,并向代理层注册MBean。
类图分析
在开启Tomcat的JMX之后,跟踪到JDK启动JMX是通过Agent.startAgent()方法完成的,以此进行源码分析,得到相关的类图如下:
类图底部中的RIMConnector即架构图第一层中的Connector的具体实现。
启动流程
整理startRemoteConnectorServer()方法的调用流程,绘制出启动时序图如下:
关联分析
结合类图和时序图来看,我们可以得到一些信息如下:
第一,JMX启动的第二步getPlatformMBeanServer(),它创建一个MBeanServer对象,而该对象作为参数传递给了JMXConnectorServer,赋值给后者的成员变量了。这就提供了JMXConnectorServer操作MBean时依赖的MBeanServer对象了。
第二,此时我们再结合tomcat那一节的注册流程来看,Registry类获取MBeanServer的源码如下:
public synchronized MBeanServer getMBeanServer() { long t1=System.currentTimeMillis(); if (server == null) { if( MBeanServerFactory.findMBeanServer(null).size() > 0 ) { server = MBeanServerFactory.findMBeanServer(null).get(0); if( log.isDebugEnabled() ) { log.debug("Using existing MBeanServer " + (System.currentTimeMillis() - t1 )); } } else { server = ManagementFactory.getPlatformMBeanServer(); if( log.isDebugEnabled() ) { log.debug("Creating MBeanServer"+ (System.currentTimeMillis() - t1 )); } } } return (server); }
我们注意到,这里先调用的是MBeanServerFactory.findMBeanServer即先从MBeanServer工厂维护的实例列表中查找是否已经创建了MBeanServer,如果有直接获取该对象。
第三,第一步中JMX启动时率先调用了一次getPlatformMBeanServer(),所以工厂类的实例列表中已经缓存了一个MBeanServer对象了,那么第二步Tomcat在注册MBean时使用的,跟第一步创建的是同一个MBeanServer对象。
第四,再来看JMX的三层结构图,此时Connector和Agent,MBean注册,使用的是同一个MBeanServer对象,这样Agent代理层就成功实现了衔接功能。
启示录
还是相同的感悟,JDK源码博大精深,这里不过是浅尝辄止,管中窥豹,取其精华一二。那个类图给了我几点启示:
首先,抽象层中的依赖类型必定是抽象类型,例如:接口JMXConnectorServerProvider类依赖的是JMXConnectorServer抽象类型,而他们的实现类依赖的是具体的子类,即ServerProvider依赖的是RMIConnectorServer。
这一点跟Java面向抽象编程的规范是一致的,也比较容易理解。在其他内容分析中也发现了这一点。
其次,利用工厂创建JMXConnectorServer实例,ConnectorBootstrap通过MBeanServerFactory和JMXConnectorServerFactory两个工厂来获取所依赖的实例对象。工厂模式在JDK和tomcat源码中很常见,但是什么样的实体应该提供工厂呢?这个我再思考思考。
- Tomcat源码分析-JMX(终)
- Tomcat源码分析-JMX(上)
- Tomcat源码分析-JMX(下)
- Tomcat源码分析-JMX之Registry类(中)
- tomcat源码解读三(2) tomcat中JMX的源码分析
- tomcat源码解读三(1) tomcat的jmx管理
- tomcat 连接 JMX(jvisualvm找不到tomcat)
- Tomcat源码分析(一)
- Tomcat源码阅读之JMX部分的设计与实现
- JMX在Tomcat中的应用(一)
- JMX在Tomcat中的应用(二)
- JMX在Tomcat中的应用(三)
- JMX在Tomcat中的应用(四)
- Java Management extentsions(jmx)与tomcat
- JMX连接tomcat(一)window篇
- JMX连接tomcat(二)Linux篇
- Tomcat源码分析(一)------ 架构
- TOMCAT源码分析(消息处理)(转)
- 欢迎使用CSDN-markdown编辑器
- 深入理解Spark 2.1 Core (十二):TimSort 的原理与源码分析
- UIView中间透明周围半透明(四种方法)
- 关于Class.forName(“com.mysql.jdbc.Driver”)
- 视频封装格式——MP4
- Tomcat源码分析-JMX(终)
- java经典面试题-百钱买百鸡
- oracle连接数
- 在本机上设置虚拟主机配置
- Android-ARGB透明度百分比对照表
- 微信小程序-携带参数的二维码条形码生成
- 从源代码到可执行文件
- leetcode Shortest Unsorted Continuous Subarray
- 【备忘】如何看一个镜像启动的参数-QQ群答疑