Tomcat源码分析-JMX(下)

来源:互联网 发布:停车场车牌识别算法 编辑:程序博客网 时间:2024/05/22 04:59

背景

上一节分析了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对象的,就是一个反射的工具类。

调用流程

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

这里写图片描述

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()就能牵出这么多的类,而我也只是大概分析了流程,浅尝辄止。这种学习方式,到底又能学到多少精华的东西呢?天知道,罢了,想多了,就是太难为自己了。唯有保持继续跟踪的心态,借以安慰自己匮乏的心灵吧。

原创粉丝点击