1.jmx和Catalina各组件的关联主要是通过StandServer类。
Catalina在启动的时候使用Digester对server.xml文件进行解析生成相应组件,主要是通过org.apache.catalina.core包中的StandServer类建立jmx和各组件之间的关联,StandServer类无参数的构造函数如下代码所示:
public StandardServer() {
super();
ServerFactory.setServer(this);
globalNamingResources = new NamingResources();
globalNamingResources.setContainer(this);
if (isUseNaming()) {
if (namingContextListener == null) {
namingContextListener = new NamingContextListener();
addLifecycleListener(namingContextListener);
}
}
}
红色部分即为关联的主要代码,ServerFactory类很简单,主要是使用单例模式设置和获得Server实例,Server实例一经设置无法更改。
2.jmx模块的分析:
启动jmx是通过建立Server的监听器,可在server.xml文件中看到,如下
<!-- JMX Support for the Tomcat server. Documentation at /docs/non-existent.html -->
<Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
ServerLifecycleListener监听Server的各种事件,在监听到Lifecycle.START_EVENT并且是Server发出的话,调用createMBeans()建立我们Server树上存在结点的Mbean。代码如下:
/**
* Create the MBeans that correspond to every existing node of our tree.
*/
protected void createMBeans() {
try {
MBeanFactory factory = new MBeanFactory();
createMBeans(factory);
createMBeans(ServerFactory.getServer());
} catch (MBeanException t) {
Exception e = t.getTargetException();
if (e == null)
e = t;
log.error("createMBeans: MBeanException", e);
} catch (Throwable t) {
log.error("createMBeans: Throwable", t);
}
}
红色部分代码即获得已建立的Server实例,往红色部分代码的下层分析可看到会建立Server管理的NamingResources和Service的Mbean,在创建他们的Mbean后又会创建它们下属的子结点。在ServerLifecycleListener类里有创建各种Mbean的函数,如下图:
ps:本人初探tomcat源码,好记性不如烂笔头,大家如有问题,可以一起交流学习