Catalina 由多个组件组成,当 Catalina 启动的时候,这些组件也会启动。当Catalina 停止的时候,这些组件也必须有机会被清除。例如,当一个容器停止
工作的时候,它必须唤醒所有加载的 servlet 的 destroy 方法,而 session 管理器要保存 session 到二级存储器中。保持组件启动和停止一致的的机制通过实现
org.apache.catalina.Lifecycle 接口来实现。一个实现了 Lifecycle 接口的组件同是会触发一个或多个下列事件:BEFORE_START_EVENT, START_EVENT, AFTER_START_EVENT, BEFORE_STOP_EVENT,STOP_EVENT, and AFTER_STOP_EVENT。当组件被启动的时候前三个事件会被触发,而组件停止的时候会触发后边三个事件。 另外,如果一个组件可以触发事件,那么必须存在相应的监听器来对触发的事件作出回应。监听器使用org.apache.catalina.LifecycleListener 来表示。
data表示绑定的数据
LifecycleListener类
该类的继承图如下:
lifeCycleListener根据server.xml进行配备,这些Listener在 digester.parse(inputSource)时从server.xml中读取,并加载,他们并不是全局的,只是属于某一个组件的,并且如果多个组件拥有同一个类型的监听器,都不会相同,也就是说监听器并不是单例的,他们都继承LifecycleListener这个接口。
该类通过一个监听器List,提供了对监听器的管理功能,例如增加,去除,对到来的事件进行遍历,以便监听器完成各自的任务
那这个类是如何与各个组件进行关联的呢
工作的时候,它必须唤醒所有加载的 servlet 的 destroy 方法,而 session 管理器要保存 session 到二级存储器中。保持组件启动和停止一致的的机制通过实现
org.apache.catalina.Lifecycle 接口来实现。一个实现了 Lifecycle 接口的组件同是会触发一个或多个下列事件:BEFORE_START_EVENT, START_EVENT, AFTER_START_EVENT, BEFORE_STOP_EVENT,STOP_EVENT, and AFTER_STOP_EVENT。当组件被启动的时候前三个事件会被触发,而组件停止的时候会触发后边三个事件。 另外,如果一个组件可以触发事件,那么必须存在相应的监听器来对触发的事件作出回应。监听器使用org.apache.catalina.LifecycleListener 来表示。
本章会对 Lifecycle, LifecycleEvent, and LifecycleListener 进行讨论。另外,还会解释一个公用类 LifecycleSupport,它给组件提供了一个简单方式来触发生命周期事件和处理事件监听器。
Catalina 的设计允许一个组件包含其它的组件。例如一个容器可以包含一系列的组件如加载器、管理器等。一个父组件负责启动和停止其子组件。 Catalina的设计成所有的组件被一个父组件来管理( in custody),所以启动 bootstrap类只需启动一个组件即可。这种单一的启动停止机制通过继承 Lifecycle 来实现。
该接口定义的生命周期事件如下:
public static final String BEFORE_INIT_EVENT = "before_init";
public static final String AFTER_INIT_EVENT = "after_init";
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 static final String AFTER_DESTROY_EVENT = "after_destroy";
public static final String BEFORE_DESTROY_EVENT = "before_destroy";
public static final String PERIODIC_EVENT = "periodic";
public static final String CONFIGURE_START_EVENT = "configure_start";
public static final String CONFIGURE_STOP_EVENT = "configure_stop";
LifecycleEvent 类
org.apache.catalina.LifecycleEvent 表示一个生命周期事件。
该类继承EventObject
private final Object data;
private final String type;
//以及在父类中定义的source
protected transient Object source;
data表示绑定的数据
type表示Lifecycle中定义的生命周期事件类型
source表示发起事件的组件
LifecycleListener类
public interface LifecycleListener {
/**
* Acknowledge the occurrence of the specified event.
*
* @param event LifecycleEvent that has occurred
*/
public void lifecycleEvent(LifecycleEvent event);
}
该类的继承图如下:
这里以tomcat8默认的server.xml为例
Server节点下配备了如图5个监听器,这些监听器会在加载Server组件的时候一同加载,且只属于Server组件。
你甚至可以自己写一个继承LifecycleListener接口的监听器,并在server.xml配置文件中在你需要监听的组件的节点下进行一样的配置。
LifecycleSupport 类
通过源码可以看到,添加监听器使用了如下方法,该方法是在LifecycleSupport类中
public void addLifecycleListener(LifecycleListener listener) {
listeners.add(listener);
}
该类的源码如下:
public final class LifecycleSupport {
public LifecycleSupport(Lifecycle lifecycle) {
super();
this.lifecycle = lifecycle;
}
private final Lifecycle lifecycle;
private final List<LifecycleListener> listeners = new CopyOnWriteArrayList<>();
public void addLifecycleListener(LifecycleListener listener) {//添加监听器
listeners.add(listener);
}
public LifecycleListener[] findLifecycleListeners() {//数组化
return listeners.toArray(new LifecycleListener[0]);
}
public void fireLifecycleEvent(String type, Object data) {//便利监听器列表,对到来的事件进行处理
LifecycleEvent event = new LifecycleEvent(lifecycle, type, data);
for (LifecycleListener listener : listeners) {
listener.lifecycleEvent(event);
}
}
public void removeLifecycleListener(LifecycleListener listener) {//移除监听器
listeners.remove(listener);
}
}
该类通过一个监听器List,提供了对监听器的管理功能,例如增加,去除,对到来的事件进行遍历,以便监听器完成各自的任务
那这个类是如何与各个组件进行关联的呢
LifecycleMBeanBase 类
public abstract class LifecycleMBeanBase extends LifecycleBase
implements JmxEnabled {
}
研究源码发现,大多数组件(不确定是不是全部)都继承了该类,而该类又继承了LifecycleBase这个类,进入这个类你可以发现,(这里就不贴了,由于这个类源码过长),
LifecycleBase类中定义了 private final LifecycleSupport lifecycle = new LifecycleSupport(this);
由此可以将组件与对生命周期事件处理的监听器关联起来。