简述
上一篇中介绍了Tomcat四大容器,Enginee、Host、Context和Wrapper以及如何通过TaskPipeline对四大容器进行功能性扩展。在 第五篇 Tomcat Container和PipeliningTasks 中我们介绍了如何通过Pipeline Task去为Enginee添加一些共用的方法,但这样还存在一些问题,我们很难对Container实例进行管理。Composite模式的一个明显的弊端就是存在大量的子容器,难以进行管理。为了解决这个问题,本篇将以四大容器为核心介绍Tomcat的生命周期。
Event
在之前的程序中,我们对容器进行管理是通过代码来实现的。
例如
...
context.start();
context.execute();
context.end();
...
Tomcat中非常核心的一个特性是向用户提供一个容器环境实现多线程,且用户透明(用户不需要关心多线程实现)。但用户在某些高级特性时候需要介入容器的管理,此时采用代码形式进行管理不足以实现这部分功能,用户若需要介入,则需要改动tomcat源码。
Event相当于Tomcat暴露给用户的一个接口去实现这部分功能,用户在需要感知Tomcat容器时,仅仅需要实现对应的event即可。
相信熟悉Spring的小伙伴们已经对于Event已经非常熟悉了,在此简单介绍一下Event。
Event是运行状态和暴露资源的封装
JDK1.1中提供了EventObject对象实现事件驱动,在没有EventObject的情况下我们实现对象运行状态管理(例如:运行,停止、自定义….),一种方式是硬编码,这种方式无法由外部模块控制,另外一种方式是轮询,这种方式外部模块不需要感知内部状态,明显的缺点是消耗大量计算资源。EventObject很好的解决了这个问题。
以下是JDK对于EventObject介绍
/**
* <p>
* The root class from which all event state objects shall be derived.
* <p>
* All Events are constructed with a reference to the object, the "source",
* that is logically deemed to be the object upon which the Event in question
* initially occurred upon.
*
* @since JDK1.1
*/
public class EventObject implements java.io.Serializable {
protected transient Object source;
//构造方法
public EventObject(Object source) {
if (source == null)
throw new IllegalArgumentException("null source");
this.source = source;
}
//Get
public Object getSource() {
return source;
}
}
不难理解,Event核心在于对于资源的暴露。在EventObject对应的核心资源是发布这个事件的对象,因此我们看到实际是对发布对象的持有 。
进一步考虑,我们对于Tomcat的Event需求是什么?回到最初的问题,我们主要需要对Tomcat进行管理,Tomcat对于容器运行阶段做了一个抽象叫做Lifecycle(生命周期)。生命周期其实就是对于常用执行状态的抽象,下一节会给大家介绍。因此我们对于Tomcat生命周期