91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Tomcat9中容器結構與生命周期的示例分析

發布時間:2021-12-11 15:08:12 來源:億速云 閱讀:244 作者:小新 欄目:編程語言

這篇文章將為大家詳細講解有關Tomcat9中容器結構與生命周期的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

容器的生命周期

容器的結構

Tomcat9中容器結構與生命周期的示例分析
上圖為Tomcat容器的類圖結構,所有容器會繼承LifecycleMBeanBase,而基類LifecycleMBeanBase實現了兩個接口,Lifecycle和MBeanRegistration,其中Lifecycle描述的容器的主要行為以及生命周期的變化,而MBeanRegistration則為Tomcat通過JMX進行監控。

org.apache.catalina.Lifecycle
Tomcat9中容器結構與生命周期的示例分析
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()等方法按照層級進行調用。
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中容器結構與生命周期的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

阜康市| 黄冈市| 玛曲县| 江阴市| 义乌市| 武夷山市| 金湖县| 九江市| 澜沧| 慈利县| 伊宁市| 上蔡县| 汾西县| 南华县| 乐亭县| 怀化市| 深水埗区| 兴安县| 芮城县| 乐清市| 青岛市| 绥宁县| 忻城县| 孝感市| 夏津县| 东台市| 兴城市| 桦川县| 天门市| 毕节市| 雅安市| 城口县| 邵武市| 新绛县| 麻城市| 乌拉特前旗| 桐柏县| 敖汉旗| 鄂州市| 沙雅县| 长岛县|