tomcat lifecycle

LifeCycle

LifeCycle 相关类

LifeCycle 接口中的状态扭转注释,如下:

 *            start()
 *  -----------------------------
 *  |                           |
 *  | init()                    |
 * NEW -»-- INITIALIZING        |
 * | |           |              |     ------------------«-----------------------
 * | |           |auto          |     |                                        |
 * | |          \|/    start() \|/   \|/     auto          auto         stop() |
 * | |      INITIALIZED --»-- STARTING_PREP --»- STARTING --»- STARTED --»---  |
 * | |         |                                                            |  |
 * | |destroy()|                                                            |  |
 * | --»-----«--    ------------------------«--------------------------------  ^
 * |     |          |                                                          |
 * |     |         \|/          auto                 auto              start() |
 * |     |     STOPPING_PREP ----»---- STOPPING ------»----- STOPPED -----»-----
 * |    \|/                               ^                     |  ^
 * |     |               stop()           |                     |  |
 * |     |       --------------------------                     |  |
 * |     |       |                                              |  |
 * |     |       |    destroy()                       destroy() |  |
 * |     |    FAILED ----»------ DESTROYING ---«-----------------  |
 * |     |                        ^     |                          |
 * |     |     destroy()          |     |auto                      |
 * |     --------»-----------------    \|/                         |
 * |                                 DESTROYED                     |
 * |                                                               |
 * |                            stop()                             |
 * ---»------------------------------»------------------------------

LifeCycle 实现类,所有主要组件都实现了 LifeCycle 接口.

Container (org.apache.catalina)
    Host (org.apache.catalina)
        TesterHost (org.apache.tomcat.unittest)
        StandardHost (org.apache.catalina.core)
    ContainerBase (org.apache.catalina.core)
        StandardEngine (org.apache.catalina.core)
        StandardWrapper (org.apache.catalina.core)
        StandardHost (org.apache.catalina.core)
        StandardContext (org.apache.catalina.core)
    Wrapper (org.apache.catalina)
        StandardWrapper (org.apache.catalina.core)
            ExistingStandardWrapper in Tomcat (org.apache.catalina.startup)
    Context (org.apache.catalina)
        TesterContext (org.apache.tomcat.unittest)
        FailedContext (org.apache.catalina.startup)
        StandardContext (org.apache.catalina.core)
    Engine (org.apache.catalina)
        StandardEngine (org.apache.catalina.core)
Executor (org.apache.catalina)
    StandardThreadExecutor (org.apache.catalina.core)
LifecycleBase (org.apache.catalina.util)
    StandardPipeline (org.apache.catalina.core)
    LifecycleMBeanBase (org.apache.catalina.util)
    StoreBase (org.apache.catalina.session)
    SessionIdGeneratorBase (org.apache.catalina.util)
WebappClassLoaderBase (org.apache.catalina.loader)
    WebappClassLoader (org.apache.catalina.loader)
    ParallelWebappClassLoader (org.apache.catalina.loader)
Service (org.apache.catalina)
    StandardService (org.apache.catalina.core)
Server (org.apache.catalina)
    StandardServer (org.apache.catalina.core)
- Lifecycle接口
    - 所有需要被生命周期管理的容器 都需要实现该接口
    - 定义生命周期事件,如BEFORE_INIT_EVENT
    - 定义生命周期方法,如init(),start(),stop()
    - 定义监听器操作:添加监听器,查询所有监听器,移除监听器 如addLifecycleListener(),findLifecycleListeners(),removeLifecycleListener()

- LifecycleBase类
    - Lifecycle接口的基础实现.基本实现逻辑: 比如,当调用standardServer.init()
        - 由于该容器类继承LifecycleBase类,且未重写init()方法, 所以会调用到LifecycleBase.init()方法
            - LifecycleBase.init()方法中先调用 LifecycleBase.setStateInternal(LifecycleState.INITIALIZING, null, false) 变更生命周期状态为LifecycleState.INITIALIZING 这个变更会调用各个事件监听中的 初始化方法
            - 模板方法,调用各个子类容器中的实现逻辑 即initInternal()方法,这个方法一般被子类覆盖,执行子类自己的逻辑 如StandServer.initInternal()
            - 变更状态为初始化完成

- 各个容器类
    - 实现init()等生命周期方法,且自行调用子容器相应的生命周期方法, 如:standServer.init() 会调用 standardService.init()

- LifecycleState 生命周期状态枚举类
    - 涉及的状态,如
        - NEW(false, null), INITIALIZING(false, Lifecycle.BEFORE_INIT_EVENT), INITIALIZED(false, Lifecycle.AFTER_INIT_EVENT), STARTING_PREP(false, Lifecycle.BEFORE_START_EVENT), STARTING(true, Lifecycle.START_EVENT), STARTED(true, Lifecycle.AFTER_START_EVENT), STOPPING_PREP(true, Lifecycle.BEFORE_STOP_EVENT), STOPPING(false, Lifecycle.STOP_EVENT), STOPPED(false, Lifecycle.AFTER_STOP_EVENT), DESTROYING(false, Lifecycle.BEFORE_DESTROY_EVENT), DESTROYED(false, Lifecycle.AFTER_DESTROY_EVENT), FAILED(false, null)
    - 生命周期状态转化
        - 如一个容器调用init()后,状态转化为NEW->INITIALIZING->INITIALIZED

- LifecycleSupport 辅助类
    - 用于帮助管理该组件或容器上的监听器,里面维护了一个监听器数组,并提供了注册,移除,触发监听器等方法

LifeCycle 实现

简单的说,各个容器会在需要的时候注册不同的 LifecycleListener,在容器启动时会触发状态扭转,每到一个状态就会遍历已经注册到 LifecycleSupport 上的所有listener.如果这个listener实现了对应状态的方法,则会调用该方法的逻辑.

注册监听流程

比如 HostConfig, ContextConfig, MapperListener 就实现了 LifecycleListener 接口.

- 注册监听 lifecycleBase.addLifecycleListener()
    - lifecycleSupport.addLifecycleListener(listener);
        - lifecycleSupport持有listener数组,和锁对象 
        private LifecycleListener listeners[] = new LifecycleListener[0]; 
        private final Object listenersLock = new Object(); // Lock object for changes to listeners 
        加锁并创建 lifecycleListener 对象 添加到 listeners 数组中

LifecycleSupport.addLifecycleListener()方法

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

}

简要的init()流程

- LifecycleBase.init() 初始化,会触发初始化前和初始化后的监听 生命周期事件INITIALIZING->INITIALIZED
    - 1.先判断状态是否为LifecycleState.NEW(默认是)
    - LifecycleBase.setStateInternal(LifecycleState.INITIALIZING, null, false); 变更生命周期状态为LifecycleState.INITIALIZING 调用各个事件监听中的 初始化方法
        - state.getLifecycleEvent(); 获取LifecycleState(生命周期状态)对应的生命周期方法.如INITIALIZING状态对应before_init()方法
        - fireLifecycleEvent(lifecycleEvent, data) 触发生命周期事件.如状态为INITIALIZING对应before_init
            - lifecycleSupport.fireLifecycleEvent() 其中LifecycleSupport对象是LifecycleBase中的成员变量,传入this如StandServer private LifecycleSupport lifecycle = new LifecycleSupport(this);
                - 遍历listeners数组,每一个listener都调用lifecycleEvent()
    - 3.initInternal();这个方法一般被子类覆盖,执行子类自己的逻辑
        - 如StandServer.initInternal()逻辑
            - super.initInternal();
    - 容器初始化完毕,LifecycleBase会将容器的状态更改为初始化完毕 setStateInternal(LifecycleState.INITIALIZED, null, false); 这样会导致调用所有listener中的lifecycleEvent()方法,各监听器会在 该方法中根据需要处理INITIALIZED事件
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FlyingZCC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值