【Tomcat学习笔记】组件声明周期

栏目: 服务器 · 发布时间: 8年前

内容简介:【Tomcat学习笔记】组件声明周期

Tomcat 里很多组件都实现了生命周期的接口,大到 Server、Service、Engine、Host、Context、Wrapper 这样的关键组件,小到 Connector、Valve 这样的小组件。

【Tomcat学习笔记】组件声明周期

大部分组件都继承了 LifecycleMBeanBase 类,从名字就可以看出,这个类主要实现了两种功能 生命周期JMXJMX 这里先不关注,后面会篇专门的笔记分析这块。 Lifecycle 这个接口定义了下面这几个方法

  • init()
  • start()
  • stop()
  • destroy()
    这些方法的执行都会让组件从生命周期的一个阶段进入另一个阶段, LifecycleState 这个枚举类定义了生命周期的各个阶段,
  • NEW
  • INITIALIZING
  • INITIALIZED
  • STARTING_PREP
  • STARTING

  • 这个状态机是这样子滴:
               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()                             |
    ----»-----------------------------»------------------------------
    

Lifecycle还定义了这些方法用来管理每个组件的监听器,当组件所在的生命周期发生变更时,就会触发一个事件,然后通知到所有监听器。

  • addLifecycleListener()
  • findLifecycleListeners()
  • removeLifecycleListener()
    为此, Lifecycle 定义了
  • BEFORE_INIT_EVENT
  • AFTER_INIT_EVENT
  • START_EVENT

  • 等一系列 EVENT 用来表示是哪个阶段的事件。

下面是 LifecycleBase 中的 init 方法的实现

publicfinalsynchronizedvoidinit()throwsLifecycleException{
    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);
}

// NOTE:这里比源码有所删减
privatesynchronizedvoidsetStateInternal(LifecycleState state,
    Object data, boolean check) throws LifecycleException {
    this.state = state;
    String lifecycleEvent = state.getLifecycleEvent();
    if (lifecycleEvent != null) {
        fireLifecycleEvent(lifecycleEvent, data);
    }
}
/**
 *  这个方法是在 LifecycleSupport 类里实现的,LifecycleBase 只是 简单的调用了一下,
 *  其他的addLifecycleListener,removeLifecycleListener ... 等管理listener的也都是
 *  通过 LifecycleSupport 来操作的
 */
publicvoidfireLifecycleEvent(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);
}

init、start、stop、destroy 这些方法都会调用各自的 initInternal、starttInternal、… 方法,internal 方法由具体的组件(LifecycleBase的子类)自己实现. 除了调用 internal 方法,这个方法的主要功能就是,设置状态,触发事件。触发事件的时候会遍历数组中的所有Listener,调用它们的lifecycleEvent方法。


以上所述就是小编给大家介绍的《【Tomcat学习笔记】组件声明周期》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Vim实用技巧

Vim实用技巧

[英] Drew Neil / 杨源、车文隆 / 人民邮电出版社 / 2014-5-1 / 59.00元

vim是一款功能丰富而强大的文本编辑器,其代码补全、编译及错误跳转等方便编程的功能特别丰富,在程序员中得到非常广泛的使用。vim能够大大提高程序员的工作效率。对于vim高手来说,vim能以与思考同步的速度编辑文本。同时,学习和熟练使用vim又有一定的难度。 《vim实用技巧》为那些想要提升自己的程序员编写,阅读本书是熟练地掌握高超的vim技巧的必由之路。全书共21章,包括121个技巧。每一章......一起来看看 《Vim实用技巧》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

SHA 加密
SHA 加密

SHA 加密工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具