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

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

本文将详细解释Tomcat9中容器结构和生命周期的示例分析。边肖觉得挺实用的,分享给大家参考。希望你看完这篇文章能有所收获。

容器的生命周期

容器的结构

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

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

org . Apache . catalina . lifetime

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

生命周期中的主要方法有初始化、启动、停止和销毁。生命周期包含12种状态,每种操作方法对应状态的变化,构成了Tomcat容器从最初创建到最终销毁的完整生命周期。生命周期的界面注释对此给出了很好的解释。

/*start()

* -

*||

*|init()|

*新-正在初始化|

*|||| - -

* |||自动| | |

*||\|/start()\|/\|/autonbs

p;      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()等方法按照层级进行调用。
Tomcat9中容器结构与生命周期的示例分析

观察者模式

容器的状态发生变化时,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中容器结构与生命周期的示例分析

关于“Tomcat9中容器结构与生命周期的示例分析”这篇文章就分享到这里了,希望

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/143175.html

(0)

相关推荐

  • mybatis-plus判断数据是否存在(springboot mybatisplus使用教程)

    技术spring boot+mybatis-plus怎样使用shardingsphere分库分表spring boot+mybatis-plus怎样使用shardingsphere分库分表,相信很多没有经验的人对此束手无

    攻略 2021年12月20日
  • wcf服务接口定义的前面需要注解啥(wcf序列化是在客户端还是服务端)

    技术WCF服务元数据结构模式是怎样的这篇文章主要介绍“WCF服务元数据结构模式是怎样的”,在日常操作中,相信很多人在WCF服务元数据结构模式是怎样的问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家

    攻略 2021年12月14日
  • 树莓派上如何安装SVN服务器

    技术树莓派上如何安装SVN服务器这篇文章主要介绍了树莓派上如何安装SVN服务器,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。sudo apt-get in

    攻略 2021年11月20日
  • 分布式服务治理框架Dubbo的前世今生及应用实战

    技术分布式服务治理框架Dubbo的前世今生及应用实战 分布式服务治理框架Dubbo的前世今生及应用实战Dubbo的出现背景
    Dubbo从开源到现在,已经出现了接近10年时间,在国内各大企业被广泛应用。

    礼包 2021年12月7日
  • 如何轻松搞定Pdf转Word用Python

    技术如何轻松搞定Pdf转Word用Python这期内容当中小编将会给大家带来有关如何轻松搞定Pdf转Word用Python,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。大家在日常的工作

    2021年10月28日
  • Oracle数据库的内存结构是什么

    技术Oracle数据库的内存结构是什么这篇文章主要介绍“Oracle数据库的内存结构是什么”,在日常操作中,相信很多人在Oracle数据库的内存结构是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望

    攻略 2021年11月4日