tomcat各组件生命周期控制

了解tomcat的同学们都知道,apache搞的模块化开发,如tomcat就定义了一大堆的组件, 各个组件负责的责任不同,但是我们的这些组件的生命周期是怎么进行控制的呢,接下来就分析一下如果实现此功能(GOF的观察者模式)的,好了,不费话了,
第一:tomcat定义了一个生命周期的接口
Lifecycle.java接口中定义了几个方法

public void start() throws LifecycleException;
public void stop() throws LifecycleException;
//以上二个方法主要是在组件启动或者停止的时候被调用,
    public void addLifecycleListener(LifecycleListener listener);
    public LifecycleListener[] findLifecycleListeners();
    public void removeLifecycleListener(LifecycleListener listener);
//以上二个方法主要是观察者的注册、移除、事件变更通知
第二:每个组件都实现了此接口并且实现了这些方法
   如:Server组件、Service组件、Connector组件、各个Container容器等
第三:使用LifecycleSupport.java类来进行注册组件变更事件的观察者管理
此类的实例在每一个组件中都保持它的一个实例
 private LifecycleSupport lifecycle = new LifecycleSupport(this);
每有注册、移除、事件变更通知时使用此属性调用来管理
在此类中定义了一个private LifecycleListener listeners[] = new LifecycleListener[0];数组在对观察都进行管理的
eg:当某个观察者想注册Server组件的话,调用过程如下:
StandardServer.java类中
public void addLifecycleListener(LifecycleListener listener) {

        lifecycle.addLifecycleListener(listener);

    }
LifecycleSupport.java类中的处理如下:
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 void start() throws LifecycleException {

        // Validate and update our current component state
        if (started) {
            log.debug(sm.getString("standardServer.start.started"));
            return;
        }

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

        [b]lifecycle.fireLifecycleEvent(START_EVENT, null);[/b]//启动事件变更通知
在LifecycleSupport.java中处理变更事件如下:
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);

    }
///还有如stop事件等
public void stop() throws LifecycleException {

        // Validate and update our current component state
        if (!started)
            return;

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

        lifecycle.fireLifecycleEvent(STOP_EVENT, null);
  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);

    }
注意对组件进行了一个封闭成一个事件进行后续的处理,
public void fireLifecycleEvent(String type, Object data) {

        [b]LifecycleEvent event = new LifecycleEvent(lifecycle, type, data);[/b]//这里的继承关系可以查看一下源码
        LifecycleListener interested[] = listeners;
        for (int i = 0; i < interested.length; i++)
            interested[i].lifecycleEvent(event);

    }

看看这东东,对开闭原则守的,软件重用非常的好,观察者到此结束……

猜你喜欢

转载自houshangxiao.iteye.com/blog/1599433