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