生命周期
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方法中,把相应的“事件”传递给所有已注册的监听器
至于有哪些“事件”呢?上面的接口定义里面已经告诉我们了,不再啰嗦
浙公网安备 33010602011771号