您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關Tomcat9中容器結構與生命周期的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
上圖為Tomcat容器的類圖結構,所有容器會繼承LifecycleMBeanBase,而基類LifecycleMBeanBase實現了兩個接口,Lifecycle和MBeanRegistration,其中Lifecycle描述的容器的主要行為以及生命周期的變化,而MBeanRegistration則為Tomcat通過JMX進行監控。
org.apache.catalina.Lifecycle
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()等方法按照層級進行調用。
容器的狀態發生變化時,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" />
關于“Tomcat9中容器結構與生命周期的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。