tomcat学习系列(1)---tomcat事件处理机制
最近在阅读“how tomcat works”这本书,结合tomcat7的源码进行学习。对于学习的收获,将通过“tomcat学习系列”记录下来,和大家一起分享和交流,也算对自己学习的一种促进。闲话不多说,正文开始。
Catalina内部由多个组件组成,启动时各个组件都需要启动,关闭时需要各个组件关闭。如何协作各个组件的初始化、启动、停止、销毁等的一致性,通过各组件实现Lifecycle这个接口来完成。各组件在启动、关闭等重要生命周期中,会发出事件通知,通知已注册的观察者做事件处理。
一、主要类图
二、主要类介绍
1) Lifecycle
Lifecycle定义了组件生命周期中的通用事件(START_EVENT、STOP_EVENT等)和接口(start、stop、destroy、addLifecycleListener、removeLifecycleListener等)。组件可以通过实现Lifecyecle接口,完成组建的重要生命周期实现和组建的观察者管理。
2)LifecycleState
定义了组件生命周期中的状态和状态对应的事件。当状态发生改变时,会发出相应事件,通知观察者进行处理。
3)LifecycleBase
Lifecycle接口的默认实现,实现init、start、stop、destroy等方法。对观察者的增加、查找和删除等操作会适配器方式,由组合的LifecycleSupport实例来完成。
4)LifecycleSupport
观察者的实际管理类,实现观察者的注册、删除、查询、调用等操作。
5)LifecycleListener
生命周期的观察者,定义了观察者的事件处理接口lifecycleEvent(LifecycleEvent event)。
6)ServerLifecycleListener
实际的观察者,实现了事件处理接口。
7)LifecycleEvent
观察者使用的参数,它封装了事件来源、事件类型和事件数据,使得观察者可以按事件来源和事件类型分类处理事件。
三、生命周期重要过程
1. 观察者注册
观察者的注册可以通过xml方式配置,也可以通过直接调用Lifecycle的观察者添加方法。server.xml中观察者配置如下:
<Server port="8005" shutdown="SHUTDOWN"> <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /> <Listener className="org.apache.catalina.core.JasperListener" /> <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" /> <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />...</Server>
public final class LifecycleSupport { // 观察者数组 private LifecycleListener listeners[] = new LifecycleListener[0]; ... public void addLifecycleListener(LifecycleListener listener) { synchronized (listenersLock) { LifecycleListener results[] = new LifecycleListener[listeners.length + 1]; for (int i = 0; i < listeners.length; i++) results[i] = listeners[i]; results[listeners.length] = listener; listeners = results; } }}public abstract class LifecycleBase implements Lifecycle { private LifecycleSupport lifecycle = new LifecycleSupport(this); // 当前状态 private volatile LifecycleState state = LifecycleState.NEW; public synchronized final void init() throws LifecycleException { if (!state.equals(LifecycleState.NEW)) { invalidTransition(Lifecycle.BEFORE_INIT_EVENT); } // 状态转移到INITIALIZING,会发送事件 setState(LifecycleState.INITIALIZING); initInternal(); setState(LifecycleState.INITIALIZED); } protected synchronized void setState(LifecycleState state, Object data) { ... this.state = state; // state为枚举类型,获取该枚举值对应的事件类型 String lifecycleEvent = state.getLifecycleEvent(); if (lifecycleEvent != null) { // 发起事件通知 fireLifecycleEvent(lifecycleEvent, data); } } // 调用LifecycleSupport进行事件处理 protected void fireLifecycleEvent(String type, Object data) { lifecycle.fireLifecycleEvent(type, data); }} public void fireLifecycleEvent(String type, Object data) { // 包装事件类型和数据 LifecycleEvent event = new LifecycleEvent(lifecycle, type, data); // 循环,通知所有观察者进行事件处理 LifecycleListener interested[] = listeners; for (int i = 0; i < interested.length; i++) interested[i].lifecycleEvent(event); }