月度归档:2014年12月

Tomcat源码分析之—具体启动流程分析

    从Tomcat启动调用栈可知,Bootstrap类的main方法为整个Tomcat的入口,在init初始化Bootstrap类的时候为设置Catalina的工作路径也就是Catalina_HOME信息、Catalina.base信息,在initClassLoaders方法中初始化类加载器,然后通过反射初始化org.apache.catalina.startup.Catalina作为catalina守护进程;

一、load

load
       Bootstrap中load流程:

  1. 反射调用Catalina的load方法。
  2. 调用Catalina的initDirs()、initNaming()初始化catalinaHome、catalina.useNaming等信息。
  3. 创建Digester对象,调用createStartDigester创建与配置Digester信息,载入Server.xml配置文件,使用Digester解析Server.xml文件,并根据Server文件的配置信息创建Server、Service、Engine、Host、Valve、Realm、Connector、Listener、Resource等对象。
  4. 设置当前Catalina为StandardServer的Catalina对象,调用initStreams。
  5. 调用StandardServer的init方法初始化Server。

      调用Bootstrap的load方法中用反射调用Catalina的load,在Catalina中初始化initDirs()路径信息,调用createStartDigester创建与配置Digester信息,载入Server.xml配置文件,使用Digester解析Server.xml文件,并根据Server文件的配置信息创建Server、Service、Engine、Host、Valve、Realm、Connector、Listener、Resource等对象,及对象的关联关系(Digester的相关知识这里就不介绍了)。由于在Digester解析Server.xml的时候已经创建Server对象,所以这里也将server的init方法初始化Server对象,至此Bootstrap执行完成,准确的说是Catalina的load载入完成。


二、start

    接着将调用Bootstrap的start方法启动容器,在start方法中也是通过反射调用Catalina的start方法,如下图:
 start 
 
    然后在Catalina中调用StandardServer对象的start方法启动server,在start方法中就会像我们在Tomcat源码分析之—组件启动实现分析那节中分析的一样,通过Tomcat的生命周期管理观察者模式实现对Service、Connector、Engine、Host、Context、Wrapper、Pipeline的启动,这里就不重复在讲解了;

三、注册关闭钩子(ShutdownHook)

if (shutdownHook == null) {
                shutdownHook = new CatalinaShutdownHook();
            }
            Runtime.getRuntime().addShutdownHook(shutdownHook);

四、调用await()与stop(),等候关闭请求与stop容器
      stop
     调用Catalina的await实际上就调用StandardServer的await如上图,等候<Server port=”8006″ shutdown=”SHUTDOWN”>在Server 8006端口上的SHUTDOWN关闭Tomcat请求。
接收到SHUTDOWN请求后调用StandardServer的stop方法与destroy方法如下图:
  sstop
生命周期管理观察者模式实现对Service、Connector、Engine、Host、Context、Wrapper、Pipeline的关闭与释放资源

五、总结
   Tomcat的启动与关闭流程到此就结束了,整个流程还是比较清晰的,只要清除Tomcat的启动流程也自然就懂得了Tomcat的关闭流程,Tomcat中使用了观察者模式对Tomcat的生命周期进行了管理,了解LifecycleBase、Lifecycle、LifecycleSupport等相关类也就了解了整个流程,整个流程的时序图如下:
 

Tomcat源码分析之——启动流程分析

                                                     tomcat启动与关闭时序图

Tomcat源码分析之—容器整体结构

Tomcat有多个容器组成,而Container也就是容器与Connecter连接器是Tomcat最核心的两个模块,Connecter连接器接收客户端的请求,并根据客户端的请求传递给Container处理并作出相应。

Tomcat中有多个层次的容器对象:Engine、Host、Context、Wrapper,这些容器是有层级关系的。

Ø  Engine:代表整个Tomcat的Servlet引擎,可以包含一个或多个子容器
Ø  Host:    表示一个虚拟主机,包含多个Context
Ø  Context :表示一个ServletContext,包含一个或多个Wrappers容器
Ø  Wrappers:表示一个独立的Servlet定义,可以是多个servlet或一个servlet实例

      所有的容器都继承ContainerBase抽象类, ContainerBase抽象类实现Container接口,Container继承Lifecycle接口用于实现对容器的生命周期的统一管理。 Container接口定义了静态字段来表示添加或移除子容器时的事件类型(如下图):                                                                 containerStatic        

通过下面图片我们看下ContainerBase的类结构,由于篇幅有限方法过多这里就不列出接口、类的字段与方法了:

           containerBase

                                                    ContainerBase类图

       1、Lifecycle接口:就是我们前面介绍过的用于控制Tomcat所有组件生命周期的接口定义。         2、LifecycleBase抽象类:实现了Lifecycle接口用户Tomcat所有组件生命周期的管理类。         3、MBeanRegistration接口:用于使Tomcat支持JMX而定义的接口。         4、LifecycleMBeanBase抽象类:继承了LifecycleBase与实现了MBeanRegistration接口,实现了JMX的支持。         5、Container接口:就是我们所有容器的接口,定义了容器通用的字段还有方法。         6、ContainerBase抽象类:所有容器的基类,实现了一些子容器管理的方法(添加、移除、查找),子容器的启动、实现了容器事件监听对象的管理、包括对Loader、Logger、Manager、Realm、Resources组件的管理、还包括了Pipeline、Valve对象的管理等。

   Tomcat所有容器类图如下(省略了字段、方法):

ContainerClass

                                                        容器类图

这节就先分析到这里,下面我们在详细分析Tomcat中的每个容器。