新西兰服务器

Tomcat9中容器结构与生命周期的示例分析


Tomcat9中容器结构与生命周期的示例分析

发布时间:2021-12-11 15:08:12 来源:高防服务器网 阅读:86 作者:小新 栏目:编程语言

这篇文章将为大家详细讲解有关Tomcat9中容器结构与生命周期的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

容器的生命周期

容器的结构

上图为Tomcat容器的类图结构,所有容器会继承LifecycleMBeanBase,而基类LifecycleMBeanBase实现了两个接口,Lifecycle和MBeanRegistration,其中Lifecycle描述的容器的主要行为以及生命周期的变化,而MBeanRegistration则为Tomcat通过JMX进行监控。

org.apache.catalina.Lifecycle

Lifecycle中主要的方法为init、start、stop、destory, Lifecycle包含12个状态,每个操作方法均对应状态的改变,构成了Tomcat容器的从初始创建到最终销毁的完整生命周期,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()                             |   * ----»-----------------------------»------------------------------   */

下图为上一篇中Tomcat内部容器类结构图,可以看到各种类型的容器均实现了Lifecycle接口,各种类型容器按照机构进行聚合和组合,int()、start()等方法按照层级进行调用。

观察者模式

容器的状态发生变化时,Tomcat采用观察者模式,触发注册在容器上的监听,下面以LifecycleBase.init()方法为例进行说明。

org.apache.catalina.util.LifecycleBase

 @Override      public final synchronized void init() throws LifecycleException {          if (!state.equals(LifecycleState.NEW)) {              invalidTransition(Lifecycle.BEFORE_INIT_EVENT);          }          try {              setStateInternal(LifecycleState.INITIALIZING, null, false);              initInternal();              setStateInternal(LifecycleState.INITIALIZED, null, false);          } catch (Throwable t) {              handleSubClassException(t, "lifecycleBase.initFail", toString());          }      }  //根据状态调用监听  private synchronized void setStateInternal(LifecycleState state, Object data, boolean check)              throws LifecycleException {         ...省略其他代码...          this.state = state;          String lifecycleEvent = state.getLifecycleEvent();          if (lifecycleEvent != null) {              fireLifecycleEvent(lifecycleEvent, data);          }      }   //调用监听  protected void fireLifecycleEvent(String type, Object data) {          LifecycleEvent event = new LifecycleEvent(this, type, data);          for (LifecycleListener listener : lifecycleListeners) {              listener.lifecycleEvent(event);          }      }
  • init()方法在实际方法执行前触发LifecycleState.INITIALIZING状态对应的监听,在实际方法执行后触发LifecycleState.INITIALIZED状态对应的监听

  • 监听会在容器初始化时进行注册,例如在server.xml中server标签下的Listener标签

    <Server port="8005" shutdown="SHUTDOWN">  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />  <!-- Security listener. Documentation at /docs/config/listeners.html  <Listener className="org.apache.catalina.security.SecurityListener" />  -->  <!--APR library loader. Documentation at /docs/apr.html -->  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />  <!--Initialize Jasper prior to webapps are loaded. Documentation at /docs/jasper-howto.html -->  <Listener className="org.apache.catalina.core.JasperListener" />  <!-- Prevent memory leaks due to use of particular java/javax APIs-->  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />

Tomcat运行时序图

关于“Tomcat9中容器结构与生命周期的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

[微信提示:高防服务器能助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。

[图文来源于网络,不代表本站立场,如有侵权,请联系高防服务器网删除]
[