您的位置:首页 > 运维架构 > Tomcat

探索《How Tomcat Works》心得(四)生命周期 Lifecycle

2016-06-07 16:31 513 查看
第六章 生命周期

其实这章早就看完了,但是由于自己的思维还是有点乱,想向前面的文章一样,用面向对象的思想叙述,所以一而再,再而三的向后托,拖到了现在。

Lifecycle这个接口规范是为了管理Catalina组件的声明周期的,保证,当catalina启动的时候,所有的组件都能启动,当Catalina关闭的时候,Catalina所有的组件都关闭,为了实现这个机制,有了Lifecycle接口规范。

我看到这里的时候,想到了Catalina之前的容器,容器中的Pipeline与Valve,容器的管道中有各种各样的阀,而当连接器传过来request和response的时候,他俩要在容器的管道中经理所有的阀,最后传递到servlet的service中。这个机制与组件的生命周期的控制的机制有点类似。下面介绍Catalina实现组件的生命周期的控制:

Lifecycle接口,这个接口有两个重要的方法,start和stop,容器实现Lifecycle接口,必须得实现好这两个方法,作为父组件,实现该方法的时候要注意调用子组件的start or stop 方法,这样,Catalina启动或者停止的时候,只需调用最上级的stop方法,然后这个方法在停止该组件的时候,会调用该组件向下的子组件的stop,这样一级一级的向下进行,最终停止所有的组件。

在组件停止或开始的时候,它除了做调用子组件的方法之外,他还要触发监听,LifecycleListener接口,表示声明周期监听器,在该接口中,只有一个方法lifecycleEvent,该方法在时间触发的时候唤醒对其“感兴趣”的监听器。

public interface LifecycleListener{

public void lifecycleEvent(LifecycleEvent event);

}
介绍实现这个方法时的算法:
public class SimpleContextLifecycleListener implements LifecycleListener {

public void lifecycleEvent(LifecycleEvent event) {
Lifecycle lifecycle = event.getLifecycle();
System.out.println("SimpleContextLifecycleListener's event " +
event.getType().toString());
if (Lifecycle.START_EVENT.equals(event.getType())) {
System.out.println("Starting context.");
}
else if (Lifecycle.STOP_EVENT.equals(event.getType())) {
System.out.println("Stopping context.");
}
}
}通过上面的代码可以看出,LifecycleListener是通过LifecycleEvent进行工作的,这个对象触发它本身感兴趣事件,通过event.getType()判断。
下面介绍LifecycleEvent对象,它表示一个生命周期事件,其用处正如上面在监听中介绍的那样,它本身含有Lifecycle,还有自身的类型,它的三个属性 Lifecycle、type、data,这三个属性的使用,别着急,在下面的内容中将作介绍。

LifecycleSupport类

这个类说实在的,就是管理Lifecycle的。这是个工具类。它的重要方法add、remove、fire。容器在继承了Lifecycle还不够,还需要拥有LifecycleSupport属性,使用这个属性来管理本容器的声明周期。

下面介绍先LifecycleSupport中的fireLifecycleEvent方法

public void fireLifecycleEvent(String type, Object data) {

LifecycleEvent event = new LifecycleEvent(lifecycle, type, data);
LifecycleListener interested[] = null;
synchronized (listeners) {
interested = (LifecycleListener[]) listeners.clone();
}
for (int i = 0; i < interested.length; i++)
interested[i].lifecycleEvent(event);

}

support工具类触发监听,监听中干diy的事情,那么介绍下触发被调用的时候(例当容器启用的时候)
public synchronized void start() throws LifecycleException {
if (started)
throw new LifecycleException("SimpleContext has already started");

// Notify our interested LifecycleListeners
lifecycle.fireLifecycleEvent(BEFORE_START_EVENT, null);
started = true;
try {
// Start our subordinate components, if any
if ((loader != null) && (loader instanceof Lifecycle))
((Lifecycle) loader).start();

// Start our child containers, if any
Container children[] = findChildren();
for (int i = 0; i < children.length; i++) {
if (children[i] instanceof Lifecycle)
((Lifecycle) children[i]).start();
}

// Start the Valves in our pipeline (including the basic),
// if any
if (pipeline instanceof Lifecycle)
((Lifecycle) pipeline).start();
// Notify our interested LifecycleListeners
lifecycle.fireLifecycleEvent(START_EVENT, null);
}
catch (Exception e) {
e.printStackTrace();
}

// Notify our interested LifecycleListeners
lifecycle.fireLifecycleEvent(AFTER_START_EVENT, null);
}

从下往上就上一个应用运行的被调用的过程。这章写的不好,请多担待吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: