真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Tomcat9中容器結(jié)構(gòu)與生命周期的示例分析

這篇文章將為大家詳細(xì)講解有關(guān)Tomcat9中容器結(jié)構(gòu)與生命周期的示例分析,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

鐵嶺縣網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián),鐵嶺縣網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為鐵嶺縣上1000+提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站制作要多少錢(qián),請(qǐng)找那個(gè)售后服務(wù)好的鐵嶺縣做網(wǎng)站的公司定做!

容器的生命周期

容器的結(jié)構(gòu)

Tomcat9中容器結(jié)構(gòu)與生命周期的示例分析
上圖為T(mén)omcat容器的類圖結(jié)構(gòu),所有容器會(huì)繼承LifecycleMBeanBase,而基類LifecycleMBeanBase實(shí)現(xiàn)了兩個(gè)接口,Lifecycle和MBeanRegistration,其中Lifecycle描述的容器的主要行為以及生命周期的變化,而MBeanRegistration則為T(mén)omcat通過(guò)JMX進(jìn)行監(jiān)控。

org.apache.catalina.Lifecycle
Tomcat9中容器結(jié)構(gòu)與生命周期的示例分析
Lifecycle中主要的方法為init、start、stop、destory, Lifecycle包含12個(gè)狀態(tài),每個(gè)操作方法均對(duì)應(yīng)狀態(tài)的改變,構(gòu)成了Tomcat容器的從初始創(chuàng)建到最終銷毀的完整生命周期,Lifecycle的接口注釋對(duì)此做出很好的解釋。

/*            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內(nèi)部容器類結(jié)構(gòu)圖,可以看到各種類型的容器均實(shí)現(xiàn)了Lifecycle接口,各種類型容器按照機(jī)構(gòu)進(jìn)行聚合和組合,int()、start()等方法按照層級(jí)進(jìn)行調(diào)用。
Tomcat9中容器結(jié)構(gòu)與生命周期的示例分析

觀察者模式

容器的狀態(tài)發(fā)生變化時(shí),Tomcat采用觀察者模式,觸發(fā)注冊(cè)在容器上的監(jiān)聽(tīng),下面以LifecycleBase.init()方法為例進(jìn)行說(shuō)明。

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());
        }
    }
//根據(jù)狀態(tài)調(diào)用監(jiān)聽(tīng)
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);
        }
    }
 //調(diào)用監(jiān)聽(tīng)
protected void fireLifecycleEvent(String type, Object data) {
        LifecycleEvent event = new LifecycleEvent(this, type, data);
        for (LifecycleListener listener : lifecycleListeners) {
            listener.lifecycleEvent(event);
        }
    }
  • init()方法在實(shí)際方法執(zhí)行前觸發(fā)LifecycleState.INITIALIZING狀態(tài)對(duì)應(yīng)的監(jiān)聽(tīng),在實(shí)際方法執(zhí)行后觸發(fā)LifecycleState.INITIALIZED狀態(tài)對(duì)應(yīng)的監(jiān)聽(tīng)

  • 監(jiān)聽(tīng)會(huì)在容器初始化時(shí)進(jìn)行注冊(cè),例如在server.xml中server標(biāo)簽下的Listener標(biāo)簽

    
    
    
    
    
    
    
    
    
    
    

Tomcat運(yùn)行時(shí)序圖

Tomcat9中容器結(jié)構(gòu)與生命周期的示例分析

關(guān)于“Tomcat9中容器結(jié)構(gòu)與生命周期的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。


文章標(biāo)題:Tomcat9中容器結(jié)構(gòu)與生命周期的示例分析
網(wǎng)站網(wǎng)址:http://weahome.cn/article/ijehpg.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部