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)

相关推荐

  • 螓怎么读,在问大侠荣威5501.8启螓版

    技术螓怎么读,在问大侠荣威5501.8启螓版你的是1螓怎么读。8T的吗带T的保养要贵一些,机油有讲究的,一定要按时换机油。另外最好热车和冷车。5年左右可能要换了,好几万噢,另外带T的发动机转速上去涡轮介入后发动机噪音会大

    生活 2021年10月24日
  • 合并HTTP请求与并行HTTP请求哪个更快

    技术合并HTTP请求与并行HTTP请求哪个更快本篇内容介绍了“合并HTTP请求与并行HTTP请求哪个更快”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希

    攻略 2021年11月11日
  • 怎么进行-2018-4990漏洞调试的分析

    技术怎么进行-2018-4990漏洞调试的分析这篇文章给大家介绍怎么进行-2018-4990漏洞调试的分析,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。测试环境Windows 7 SP1 x86Ad

    攻略 2021年11月25日
  • 樱花几月开的最旺盛,樱花是几月开花到几月谢呢

    技术樱花几月开的最旺盛,樱花是几月开花到几月谢呢樱花的花期一般在3-4月樱花几月开的最旺盛,受气候条件影响,会略有波动,一般在四月初最为繁盛,花期不长,一般10-15天。 樱花(学名:Cerasus sp.):是蔷薇科樱

    生活 2021年11月1日
  • 如何进行C#回车切换焦点实现的探讨

    技术如何进行C#回车切换焦点实现的探讨今天就跟大家聊聊有关如何进行C#回车切换焦点实现的探讨,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。C#回车切换焦点实现的探

    攻略 2021年11月24日
  • 如何解决win7注册表损坏导致无法引导启动问题

    技术如何解决win7注册表损坏导致无法引导启动问题这篇文章给大家分享的是有关如何解决win7注册表损坏导致无法引导启动问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。系统注册表损坏,用U盘启

    攻略 2021年11月17日