Tomcat的生命周期管理

Lifecycle接口

Tomcat通过org.apache.catalina.Lifecycle接口统一管理生命周期,所有有生命周期的组件都要实现Lifecycle接口,Lifecycle接口共做了4件事
1.定义了13个String类型常量,用于LifecycleEvent事件的type属性中,作用是区分组件发出的LifecycleEvent事件时的状态(如初始化前、启动前、启动中等)。这种设计方式可以让多种状态都发送同一种类型的事件(LifecycleEvent)然后用其中的一个属性来区分状态而不用定义多种事件,我们要学习和借鉴这种方式
2.定义了三个管理监听器的方法addLifecycleListener、findLifecycleListener和 removeLifecycleListener,分别用来添加、查找和删除LifecycleListener类型的监听器
3.定义了4个生命周期的方法:init、start、stop和destroy,用于执行生命周期的各个阶段的操作
4.定义了获取当前状态的两个方法getState和getStateName,用来获取当前状态

LifecycleBase

Lifecycle接口的默认实现是org.apache.catalina.util.LifecycleBase,所有实现了生命周期的组件都直接或间接地继承自LifecycleBase,LifecycleBase为Lifecycle里的接口方法提供了默认实现:监听串成管理是专门使用了一个LifecycleSupport类来完成的,LifecycleSupport中定义了一个LIfecycleListener数据类型的属性来保存所有的监听器,然后并定义了添加,删除、查找和执行监听的方法

//org.apache.catalina.util.LifecycleSupport
//用于保存监听器
private LifecycleListener listeners[] = new LifecycleListener[0];
//当监听器发生变化时进行同步的同步锁
private final Object listenersLock = new Object();
//添加一个监听器
public void addLifecycleListener(LifecycleListener listener){
	synchronized(listenersLock){
		LifecycleListener results[] = new LifecycleListener[listener.length + 1];
		for(int i=0;i<listeners.length;i++){
			results[i] = listeners[i];
		}
		results[listeners.length] = listener;
		listeners = results;
	}
}
//获取所有监听器
public LifecycleListener[] findLifecycleListeners(){
	return listeners;
}
//删除一个监听器
public void removeLifecycleListener(LifecycleListener listener){
	synchronized(listenersLock){
		int n = -1;
		for(int i=0;i<listeners.length;i++){
			if(listeners[i]==listener){
				n = i;
				break;
			}
		}
		if(n<0){
			return;
		}
		LifecycleListener results[] = new LifecycleListener[listeners.length - 1];
		int j = 0;
		for(int i =0;i<listeners.length;i++){
			if(i!=n){
				results[j++] = listeners[i];
			}
		}
		listeners = results;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值