tomcat的组件生命周期分析

tomcat每个组件其实都是继承自一个叫做LifecycleMBeanBase的抽象基类,而这个抽象类继承LifecycleBase的抽象基类,LifecycleBase类实现了Lifecycle接口,关于Lifecycle接口的定义为

public void addLifecycleListener(LifecycleListener listener);
public LifecycleListener[] findLifecycleListeners();
public void removeLifecycleListener(LifecycleListener listener);
public void init() throws LifecycleException;
public void start() throws LifecycleException;
public void stop() throws LifecycleException;
public void destroy() throws LifecycleException;
public LifecycleState getState();
public String getStateName();

 

而在接口代码的注释中,作者给出了生命周期的运行原则,比如LifecycleBase中实现的Init()方法代码:

@Override
    public final synchronized void init() throws LifecycleException {
        if (!state.equals(LifecycleState.NEW)) {
            invalidTransition(Lifecycle.BEFORE_INIT_EVENT);
        }
        setStateInternal(LifecycleState.INITIALIZING, null, false);
        try {
            initInternal();
        } catch (Throwable t) {
            ExceptionUtils.handleThrowable(t);
            setStateInternal(LifecycleState.FAILED, null, false);
            throw new LifecycleException(
                    sm.getString("lifecycleBase.initFail",toString()), t);
        }
        setStateInternal(LifecycleState.INITIALIZED, null, false);
    }

 
   
   
    protected abstract void initInternal() throws LifecycleException;
可以看出生命周期的控制已经在其中显示出来,首先如果不是从NEW状态过来进行初始化的一律为无效状态,一旦进入初始化则进入INITIALIZING状态,其次如果初始化失败进入FAILED的状态,而如果初始化完成,则进入INITIALIZED状态,留出 initInternal()供个性化初始化。
   通过addLifecycleListener方法可以添加组件的监听者,当组件进行状态变换时,都会通过事件进行通知
   下面为监听者接口的代码

public interface LifecycleListener {
    /**
     * Acknowledge the occurrence of the specified event.
     *
     * @param event LifecycleEvent that has occurred
     */
    public void lifecycleEvent(LifecycleEvent event);

}

 

  只有一个方法,就是当监听者得到事件后该如何处理的方法,而方法的参数则是LifecycleEvent类,一个包含了事件信息的类,实际上就是观察者模式的一个实践,也是接口和需接口的一个对接过程
     那么再来说说LifecycleMBeanBase类,实际上他实现了MBeanRegistration接口,实现了这个接口后组件便可以注册在MBeanServer上供远程调用了解tomcat的内部状态等并进行tomcat的控制。

猜你喜欢

转载自wanglonglog.iteye.com/blog/1625448