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

第六章 生命周期

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

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);
  }

从下往上就上一个应用运行的被调用的过程。这章写的不好,请多担待吧。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值