首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 开源软件 >

Tomcat7起步分析(五)Lifecycle机制和实现原理

2013-08-10 
Tomcat7启动分析(五)Lifecycle机制和实现原理在上篇文章分析Tomcat7的各组件的init、start方法时经常会看到

Tomcat7启动分析(五)Lifecycle机制和实现原理

在上篇文章分析Tomcat7的各组件的init、start方法时经常会看到有一个setStateInternal方法的调用,在查看LifecycleBase类及其它各组件的源码时会在多处看到这个方法的调用,这篇文章就来说说这方法,以及与这个方法相关的Tomcat的Lifecycle机制和实现原理。

?

上篇文章里谈到Tomcat7的各组件的父类LifecycleBase类,该类实现了接口org.apache.catalina.Lifecycle,下面是这个接口里定义的常量和方法:

Tomcat7起步分析(五)Lifecycle机制和实现原理
细心的读者会发现,上篇文章里提到的init和start方法实际上是在这个接口里面定义好的,也正因为有各组件最终都会实现这个接口作为前提条件,所以才能支持组件内部的initInternal、startInternal方法内对于子组件(组件里面嵌套的子组件都是以接口的形式定义的,但这些接口都会以Lifecycle作为父接口)的init和start方法的调用。通过这种方式,只要调用了最外层的Server组件的init和start方法,就可以将Tomcat内部的各级子组件初始化和启动起来。我叫这种方式为链式调用。实际上关于Tomcat的关闭机制也是通过这种方式一步步调用各层组件的stop方法的。这里不再展开叙述,留待读者自己研究研究吧。Tomcat7起步分析(五)Lifecycle机制和实现原理

?

Lifecycle接口中的这些字符串常量定义主要用于事件类型的定义,先按下不表,文章后面会提到。

?

重点看下面三个方法:

public enum LifecycleState {    NEW(false, null),    INITIALIZING(false, Lifecycle.BEFORE_INIT_EVENT),    INITIALIZED(false, Lifecycle.AFTER_INIT_EVENT),    STARTING_PREP(false, Lifecycle.BEFORE_START_EVENT),    STARTING(true, Lifecycle.START_EVENT),    STARTED(true, Lifecycle.AFTER_START_EVENT),    STOPPING_PREP(true, Lifecycle.BEFORE_STOP_EVENT),    STOPPING(false, Lifecycle.STOP_EVENT),    STOPPED(false, Lifecycle.AFTER_STOP_EVENT),    DESTROYING(false, Lifecycle.BEFORE_DESTROY_EVENT),    DESTROYED(false, Lifecycle.AFTER_DESTROY_EVENT),    FAILED(false, null),    MUST_STOP(true, null),    MUST_DESTROY(false, null);    private final boolean available;    private final String lifecycleEvent;    private LifecycleState(boolean available, String lifecycleEvent) {        this.available = available;        this.lifecycleEvent = lifecycleEvent;    }    /**     * May the public methods other than property getters/setters and lifecycle     * methods be called for a component in this state? It returns     * <code>true</code> for any component in any of the following states:     * <ul>     * <li>{@link #STARTING}</li>     * <li>{@link #STARTED}</li>     * <li>{@link #STOPPING_PREP}</li>     * <li>{@link #MUST_STOP}</li>     * </ul>     */    public boolean isAvailable() {        return available;    }    /**     *     */    public String getLifecycleEvent() {        return lifecycleEvent;    }}

这个类在之前的Tomcat4和Tomcat5中都没有看到,可能是Tomcat7里面新定义的吧,就是一个枚举,内嵌了两个实例变量,一个布尔值表示是否可用,一个字符串表示是事件类型,看已经定义的枚举值里面发现这个字符串要么不设值,要么就是Lifecycle类中定义好的字符串常量。这个类实际上就是对Lifecycle类中定义好的字符串常量做了另外一层封装。

?

再说回开头在各组件代码中经常会看到的setStateInternal方法的调用,实际上就是向该组件中已注册的监听器发布一个事件。

热点排行