生命周期

Catalina由多个组件组成,当Catalina启动的时候,这些组件也会启动。当Catalina停止的时候,这些组件也必须有机会被清除。例如,当一个容器停止工作的时候,它必须唤醒所有加载的servlet的destroy方法,而session管理器要保存session到二级存储器中。保持组件启动和停止一致的的机制通过实现org.apache.catalina.Lifecycle接口来实现。

Lifecycle接口

一个实现可Lifecycle接口的组件可以触发一个或多个下列事件:
BEFORE_START_EVENT, START_EVENT, AFTER_START_EVENT, BEFORE_STOP_EVENT,STOP_EVENT, and AFTER_STOP_EVENT。

public interface Lifecycle {
    public static final String START_EVENT = "start";
    public static final String BEFORE_START_EVENT = "before_start";
    public static final String AFTER_START_EVENT = "after_start";
    public static final String STOP_EVENT = "stop";
    public static final String BEFORE_STOP_EVENT = "before_stop";
    public static final String AFTER_STOP_EVENT = "after_stop";
    public void addLifecycleListener(LifecycleListener listener);
    public LifecycleListener[] findLifecycleListeners();
    public void removeLifecycleListener(LifecycleListener listener);
    public void start() throws LifecycleException;
    public void stop() throws LifecycleException;
}

 

看清楚了,其实就是一些常量加上start、stop这些方法。

那么这个接口存在的意义是什么呢?这其实和tomcat的架构有 关,因为tomcat是以“容器”的方式来组织的,在前面的几章中也提到了,容器是以树结构组织的,也就是除了根容器之外,其他容器肯定都有且仅有一个父 容器,一层套一层。tomcat的启动一般是通过Bootstrape类来完成的,这个类会调用根节点容器的启动方法。但是那么多的子容器怎么办 呢,Bootstrape不可能一一启动它们;需要关闭tomcat时也是如此。唯一的办法是定义一个统一的接口,把所有的启动、停止等与“生命周期”有 关的方法组织到一块,这个接口就是Lifecycle。

因此,一般容器的start方法里面,都会它所包含的子容器和其他实现了生命周期接口的组件的start方法,子容器又以此类推递归调用它们的子容器,整个tomcat就跑起来了。

Lifecycle Listener

Lifecycle 当然不会仅仅有start和stop这么简单,它还引入了类似GUI编程的“事件——监听”机制。具体来说就是 org.apache.catalina.LifecycleListener 接口,内容非常简单,就一个 lifecycleEvent(LifecycleEvent event) 方法,用于接收相应的事件。如果你接触过GUI编程,特别是java swing,猜也能猜到tomcat怎么做了——首先注册listener,然后在start或者stop方法中,把相应的“事件”传递给所有已注册的监听器

至于有哪些“事件”呢?上面的接口定义里面已经告诉我们了,不再啰嗦

posted on 2016-06-12 17:43  cbwleft  阅读(85)  评论(0)    收藏  举报