学习tomcat 小记(9)

1. Digester
将所有的配置都写到代码里很不利于使用和扩展。tomcat中使用xml文件(如server.xml)来记录系统配置。例如,server.xml中,一个Context标签表示一个context容器。设置path和docPath属性可以使用下面的配置:
<context docBase="myApp" path="/myApp"/>

tomcat使用了开源库Digester将xml文件中的元素转换为java对象。

Digester是apache commons下的一个子项目,包含下面三个包:
(1)org.apache.commons.digester:该包可用于处理xml文件;
(2)org.apache.commons.digester.rss:可用于解析rss;
(3)org.apache.commons.digester.xmlrules:该包提供了基于xml的定义。


2. Shutdown Hook
在很多实际应用环境中,当管理员关闭了你的应用程序时,你需要做一些善后清理工作。但问题,管理员才不管你那一套,很有可能不给你做清理工作。例如,在tomcat的部署应用中,通过实例化一个server对象来启动servlet容器,调用其start方法,然后逐个调用组件的start方法。正常情况下,为了关闭这些已经启动的组件,你应该发送关闭命令(如14章所述)。
tomcat中提供了hook,可以在关闭过程中运行一些代码,执行清理的工作。在java中,有两种事件会关闭虚拟机:
(1)当调用System.exit()方法或程序的最后一条代码执行完毕时,程序正常退出;
(2)用户键入ctrl+c或在未关闭java程序的情况下,退出系统,会导致jvm强制关闭。

在关闭jvm时,虚拟机会经过以下两个阶段:
(1)虚拟机启动所有已经注册的shutdown hook。shutdown hook是先前已经注册到Runtime中的线程,所有的shutdown hook会并发执行,直到完成任务;
(2)虚拟机调用所有没有被调用过多析构方法。

tomcat中的shutdown hook
org.apache.catalina.startup.Catalina类中,你可以找到shutdown hook。CatalinaShutdownHook类继承自java.lang.Thread,实现了run方法,该方法中会调用server的stop方法。

3.启动tomcat
tomcat启动的过程,使用了两个类,Catalina和Bootstrap,均在org.apache.catalina.startup包下。Catalina类用于启动关闭server对象,并对server.xml文件进行解析。Bootstrap类创建Catalina的实例,并调用其process方法。

Catalina类
org.apache.catalina.startup.Catalina类是启动类。它包含了一个Digester对象用于解析server.xml文件。Catalina类中还有一个server对象(server中包含有service),正如15章所述,service对象中有一个container和一个或多个的connector。

Bootstrap类
org.apache.catalina.startup.Bootstrap类提供了启动tomcat的切入点(还有一些其他的类也有此功能)。当使用bat或sh启动tomcat时,实际上会调用该类的main方法。在main方法中会创建三个loader,并实例化Catalina对象,然后调用Catalina对象的process方法。

4. Manager Servlet
tomcat4和5中使用manager应用可以方便的部署web应用程序。但是,manager应用并不在%CATALINA_HOME%/webapps目录下,而在%CATALINA_HOME%/server/webapps目录下。当tomcat启动时,会安装manager应用,因为manager应用有一个描述符文件,manager.xml。

5.基于JMX的管理
既然ContainerServlet已经可以管理tomcat,为啥要用jmx?因为jmx更灵活。许多基于服务器的应用程序,如tomcat,jboss,jonas,geromino等,使用jmx管理其资源。
jmx规范(书中指规范1.2.1版本)定义了管理java对象的公开标准。例如,tomcat4和5使用jmx来启动servlet容器中的各种对象(如server,host,context,valve等),这样更灵活,更易于管理。tomcat的开发者也编写了admin应用来管理其他web应用。
由基于jmx的管理应用程序管理的java对象成为jmx托管资源。事实上,一个jmx托管资源也可以是一个应用程序,一个service实现,一个设备,一个用户等等。jmx托管资源由java编写,提供了相应的包装。
要想将一个java对象转换为jmx托管资源,你需要另外创建一个名为MBean的对象。org.apache.catalina.mbeans包下,包含有一些MBean,例如,ConnectorMBean,StandardEngineMBean,StandardHostMBean,StandardContextMBean。由名字可猜想,ConnectorMBean用于管理connector,StandardContextMBean用于管理org.apache.catalina.core.StandardContext实例。你也可以编写自己的MBean管理你自己的java对象。
MBean类暴露出了它所管理的java对象的属性和方法。管理应用程序本身并不直接访问它所管理的java对象,因此,你可以选择性的暴露出需要的属性和方法。
拥有的MBean类后,你将它实例化,并将其注册到MBean服务器中。MBean服务器是一个应用中所有MBean注册的中心地。管理应用程序通过MBean服务器访问MBean。


你可能感兴趣的:(java,tomcat)