Coin163

首页 > Tomcat源码分析-JMX(下)

Tomcat源码分析-JMX(下)

相关标签: tomcat 源码

2020腾讯云限时秒杀,爆款1核2G云服务器99元/年!(领取2860元代金券),
地址https://cloud.tencent.com/act/cps/redirect?redirect=1062

2020阿里云最低价产品入口+领取代金券(老用户3折起),
入口地址https://www.aliyun.com/minisite/goods

相关推荐:Tomcat源码分析-JMX之Registry类(中)

背景 “Tomcat源码分析-StandardServer类”,这一篇文章的分析中,我们知道StandardServer类的实例被注册到JMX的服务器的过程,是通过Tomcat定义的Registry类完成的,那么这个类又是如何完成JMX相关功能的呢,本文就记录一下本人在源码跟踪过程中的分析结果。

背景

上一节分析了Registry类的功能,其引用management包中所有的类,也就是JDK支持JMX功能的类,本节将继续分析类图的其他部分。

类图分析

JMX的类图截取如下:

这里写图片描述

分析类图得到几点信息如下:
第一,JmxBeanServer和DefaultMBeanServerInterceptor类,它们都是MBeanServer接口的实现类,即它们都是MBeanServer类型。Tomcat中引用是通过调用JmxBeanServer的静态工厂方法newMBeanServer()来获取MBeanServer实例的。

第二,JmxBeanServer类的成员变量mbsInterceptor就是在其构造函数中直接new的一个DefaultMBeanServerInterceptor对象,然后JmxBeanServer实现MBeanServer接口的所有的方法都是委派mbsInterceptor实现的。

第三,再看看DefaultMBeanServerInterceptor类,它所实现的MBeanServerInterceptor接口的方法定义,与底部右下角的MBeanInstantiator类提供的方法是一致的;而DefaultMBeanServerInterceptor类关联了一个MBeanInstantiator成员变量。由此可知,这也是简单的委派来实现接口的方法。

第四,Repository类,是一个容器类,用来管理MBean的增删改查的。MBeanInstantiator类是一个普通的class,没有实现任何接口,它是通过反射来创建Java对象的,就是一个反射的工具类。

相关推荐:Tomcat 源码分析

转载于:http://www.uml.org.cn/j2ee/201306285.asp 一、架构 下面谈谈我对Tomcat架构的理解 总体架构: 1、面向组件架构 2、基于JMX 3、事件侦听 1)面向组件架构 tomcat代码看似很庞大,但从结构上看却很清晰和简单,它主要由一堆组件组成,如Server、Servi

调用流程

通过源码跟踪,可以可以绘制出整个调用过程的时序图如下:

这里写图片描述

JMX实践

JMX的HelloWorld实现也很简单,Agent端的代码就是获取一个MBeanServer实例的过程,JDK提供的API调用ManagementFactory的getPlatformMBeanServer()。

    public static void main(String[] args) throws JMException, Exception {
        MBeanServer server = ManagementFactory.getPlatformMBeanServer();
        ObjectName helloName = new ObjectName("jmxBean:name=hello");
        // create mbean and register mbean
        server.registerMBean(new Hello(), helloName);
        Thread.sleep(60 * 60 * 1000);
    }

这里,我只关注那一行JMX的API方法,而详细的JMX的HelloWorld程序,请参考:http://damies.iteye.com/blog/51788

延伸思考

首先,配置tomcat的jmx参数后,我们可以通过jconsole.exe来监控tomcat服务器的运行状况,除了MBean外,还可以监控各个线程当前的状态、堆内存情况。

其次,分析源码后,我们也能学到一点JDK的编码思想,就是凡是一个接口的实现方法中有get、set时,它的实现类必定包含一个该类型的成员变量。还有一点,就是接口有父接口的情况下,其实现类可以只提供一个接口的方法,而另外接口的方法可以通过委派自身的成员变量来完成。

我以为这样的好处是可以控制当前实现类的代码量不至于过多,毕竟就是一行调用的代码,比完全实现N个方法的代码量,相比之下少了太多了。

最后,Tomcat真是博大精深,一行简单的Registry.registerComponent()就能牵出这么多的类,而我也只是大概分析了流程,浅尝辄止。这种学习方式,到底又能学到多少精华的东西呢?天知道,罢了,想多了,就是太难为自己了。唯有保持继续跟踪的心态,借以安慰自己匮乏的心灵吧。

原文

背景 上一节分析了Registry类的功能,其引用management包中所有的类,也就是JDK支持JMX功能的类,本节将继续分析类图的其他部分。 类图分析 JMX的类图截取如下: 分析类图得到几点信息如下: 第

------分隔线----------------------------