Tomcat9中容器结构与生命周期的示例分析
这篇文章将为大家详细讲解有关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" />
Tomcat运行时序图
关于“Tomcat9中容器结构与生命周期的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:niceseo99@gmail.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
评论