Tomcat第四篇——生命周期

Posted 搬砖小松鼠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Tomcat第四篇——生命周期相关的知识,希望对你有一定的参考价值。

Lifecycle

Tomcat中进行生命周期管理的接口是Lifecycle,Tomcat中的组件基本都继承了该接口。

下面来看看该接口中生命周期方法的定义:

Lifecycle定义了四种生命周期状态:init、start、stop、destroy,并且提供了四个方法,并且在接口中定义了关于这四个状态多包含的一些事件,整个状态流转如下图:

* The valid state transitions for components that support @link Lifecycle
 * are:
 * <pre>
 *            start()
 *  -----------------------------
 *  |                           |
 *  | init()                    |
 * NEW ->-- INITIALIZING        |
 * | |           |              |     ------------------<-----------------------
 * | |           |auto          |     |                                        |
 * | |          \\|/    start() \\|/   \\|/     auto          auto         stop() |
 * | |      INITIALIZED -->-- STARTING_PREP -->- STARTING -->- STARTED -->---  |
 * | |         |                                                  |         |  |
 * | |         |                                                  |         |  |
 * | |         |                                                  |         |  |
 * | |destroy()|                                                  |         |  |
 * | -->-----<--       auto                    auto               |         |  |
 * |     |       ---------<----- MUST_STOP ---------------------<--         |  |
 * |     |       |                                                          |  |
 * |    \\|/      ---------------------------<--------------------------------  ^
 * |     |       |                                                             |
 * |     |      \\|/            auto                 auto              start()  |
 * |     |  STOPPING_PREP ------>----- STOPPING ------>----- STOPPED ---->------
 * |     |                                ^                  |  |  ^
 * |     |               stop()           |                  |  |  |
 * |     |       --------------------------                  |  |  |
 * |     |       |                                  auto     |  |  |
 * |     |       |                  MUST_DESTROY------<-------  |  |
 * |     |       |                    |                         |  |
 * |     |       |                    |auto                     |  |
 * |     |       |    destroy()      \\|/              destroy() |  |
 * |     |    FAILED ---->------ DESTROYING ---<-----------------  |
 * |     |                        ^     |                          |
 * |     |     destroy()          |     |auto                      |
 * |     -------->-----------------    \\|/                         |
 * |                                 DESTROYED                     |
 * |                                                               |
 * |                            stop()                             |
 * --->------------------------------>------------------------------
 *

LifecycleBase

LifecycleBase是对Lifecycle中的init、start、stop和destroy方法进行了实现,并且提供了四个钩子方法,用于实现自身的初始化

下面主要分析下init和start方法,另外两个方法类似

public final synchronized void init() throws LifecycleException 
        //1:用于状态检查等
        if (!state.equals(LifecycleState.NEW)) 
            invalidTransition(Lifecycle.BEFORE_INIT_EVENT);
        
        //2:设置状态
        setStateInternal(LifecycleState.INITIALIZING, null, false);
        //3:执行钩子方法,内部初始化
        try 
            initInternal();
         catch (Throwable t) 
            ExceptionUtils.handleThrowable(t);
            setStateInternal(LifecycleState.FAILED, null, false);
            throw new LifecycleException(
                    sm.getString("lifecycleBase.initFail",toString()), t);
        
        //4:设置状态
        setStateInternal(LifecycleState.INITIALIZED, null, false);
    
public final synchronized void start() throws LifecycleException 
        //1:状态判断或状态流转
        if (LifecycleState.STARTING_PREP.equals(state) ||
                LifecycleState.STARTING.equals(state) ||
                LifecycleState.STARTED.equals(state)) 
            
            if (log.isDebugEnabled()) 
                Exception e = new LifecycleException();
                log.debug(sm.getString("lifecycleBase.alreadyStarted",
                        toString()), e);
             else if (log.isInfoEnabled()) 
                log.info(sm.getString("lifecycleBase.alreadyStarted",
                        toString()));
            
            
            return;
        
        
        if (state.equals(LifecycleState.NEW)) 
            init();
         else if (state.equals(LifecycleState.FAILED))
            stop();
         else if (!state.equals(LifecycleState.INITIALIZED) &&
                !state.equals(LifecycleState.STOPPED)) 
            invalidTransition(Lifecycle.BEFORE_START_EVENT);
        
        //2:设置状态
        setStateInternal(LifecycleState.STARTING_PREP, null, false);
       //3:执行钩子方法
        try 
            startInternal();
         catch (Throwable t) 
            ExceptionUtils.handleThrowable(t);
            setStateInternal(LifecycleState.FAILED, null, false);
            throw new LifecycleException(
                    sm.getString("lifecycleBase.startFail",toString()), t);
        
        //4:设置状态
        if (state.equals(LifecycleState.FAILED) ||
                state.equals(LifecycleState.MUST_STOP)) 
            stop();
         else 
            // Shouldn't be necessary but acts as a check that sub-classes are
            // doing what they are supposed to.
            if (!state.equals(LifecycleState.STARTING)) 
                invalidTransition(Lifecycle.AFTER_START_EVENT);
            
            
            setStateInternal(LifecycleState.STARTED, null, false);
        
    

生命周期这块可以参考下第二篇中 Tomcat的启动,里面就是父容器分别调用子容器进行初始化和start的

以上是关于Tomcat第四篇——生命周期的主要内容,如果未能解决你的问题,请参考以下文章

第四篇:数据是如何在 React 组件之间流动的?(上)

第四篇:数据是如何在 React 组件之间流动的?(上)

第四篇 mybatis的运行原理:重要组件的介绍

Tomcat 第四篇:请求处理流程(上)

Servlet生命周期和工作原理

深入浅出Tomcat/3 - Tomcat生命周期