Tomcat原理学习---生命周期

Catalina由多个组件组成,当Catalina启动的时候,这些组件也会启动。当Catalina停止的时候,这些组件也必须有机会被清除。例如,当一个容器停止工作的时候,它必须唤醒所有加载的servlet 的destroy方法,而session管理器要保存session到二级存储器中。保持组件启动和停止一致的的机制通过实现org.apache.catalina.Lifecycle接口来实现。 
一个实现了Lifecycle接口的组件同是会触发一个或多个下列事件:
BEFORE_START_EVENT, START_EVENT, AFTER_START_EVENT, BEFORE_STOP_EVENT, STOP_EVENT, and AFTER_STOP_EVENT。
当组件被启动的时候前三个事件会被触发,而组件停止的时候会触发后边三个事件。另外,如果一个组件可以触发事件,那么必须存在相应的监听器来对触发的事件作出回应。监听器使用org.apache.catalina.LifecycleListener来表示。 
本章会对Lifecycle, LifecycleEvent, and LifecycleListener进行讨论。另外,还会解释一个公用类LifecycleSupport,它给组件提供了一个简单方式来触发生命周期事件和处理事件监听器。


Lifecycle 接口:
Catalina的设计允许一个组件包含其它的组件。例如一个容器可以包含一系列的组件如加载器、管理器等。一个父组件负责启动和停止其子组件。Catalina的设计成所有的组件被一个父组件来管理(in custody),所以启动bootstrap类只需启动一个组件即可。这种单一的启动停止机制通过继承 Lifecycle来实现。
Lifecycle中最重要的方法是start 和stop方法。一个组件提供了这些方法的实现,所以它的父组件可以通过这些方法来启动和停止他们。
组件的监听器对组件可能触发的时间“感兴趣”,当一个事件被触发的时候,相应监听器会被通知。一个Lifecycle实例可以触发使用静态最终字符串定义的六个事件。 
LifecycleEvent 类 :
org.apache.catalina.LifecycleEvent表示一个生命周期事件。
LifecycleListener 接口 :
org.apache.catalina.LifecycleListener接口可以表示生命周期监听器,在该接口中,只有一个方法lifecycleEvent,该方法在事件触发的时候唤醒对其“感兴趣”的监听器。 
LifecycleSupport 类 
Catalina提供了一个公用类org.apache.catalina.util.LifecycleSupport来简化组件处理监听器和触发生命周期事件。
addLifecycleListener(LifecycleListener listener) 添加一个生命周期事件
removeLifecycleListener(LifecycleListener listener) 删除一个生命周期监听事件
fireLifecycleEvent(String type, Object data) 触发一个事件


The Application :
ex06.pyrmont.core.SimpleContext :
注意start方法是如何启动所有子容器以及其相关组件(容易加载器、流水线和映射器)的,以及stop方法是如何停止这些组件的。使用该机制,可以启动容器模型中所有的组件,你只需要启动最高层的组件即可(在该例子中SimpleContext实例)。而停止它们的时候只需简单停止相同的组件即可。 
ex06.pyrmont.core.SimpleContextLifecycleListener:
SimpleContextLifecycleListener表示SimpleContext实例的监听器。 
ex06.pyrmont.core.SimpleLoader :
SimpleLoader跟第五章中相似,不同之处在于它实现了Lifecycle接口,所实现的方法什么都没做只是打印出一些字符串到控制台上。更重要的是,实现了Lifecycle接口,一个SimpleLoader实例就可以通过其相关容器启动它。 
ex06.pyrmont.core.SimplePipeline :
另外Pipeline接口和SimplePipeline类也实现了Lifecycle接口。从Lifecycle接口的来的方法被留空,现在这个类的的实例可以由其相关容器来启动,该类的其他的部分跟第五章中的相似。 
ex06.pyrmont.core.SimpleWrapper :
该类跟ex05.pyrmont.core.SimpleWrapper很相似。在该应用中,它实现了Lifecycle接口,所以它可以由其父容器来启动。在该程序中,出start和stop方法之外的大多数从Lifecycle接口获得的方法被留空。
SimpleWrapper 中的start方法跟SimpleContext类中的start方法相似。它启动所有的组件并触发BEFORE_START_EVENT, START_EVENT,和 AFTER_START_EVENT事件。 SimpleWrapper的stop方法更有趣,它打印出一个简单的字符串,并唤醒servlet实例的destroy方法。
然后它检查该包装器是否被启动了,如果没有会抛出LifecycleException。
接下来,它触发BEFORE_STOP_EVENT 和 STOP_EVENT事件并重置started布尔变量。 
接下来它停止跟其相关的流水线组件和加载器。在该应用程序中, SimpleWrapper实例没有加载器。 
最后,它触发了AFTER_STOP_EVENT事件。 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值