2 Tocmat的生命周期管理
2.1 Lifecycle 接口
Tomcat通过Lifecycle接口统一管理生命周期,所有有生命周期的组件都要实现Lifecycle接口。它一共做了4件事
-
定义13个String类型常量,用于LifecycleEvent事件的type属性中,为了区分组件发出的LifecycleEvent事件时的状态(初始化前、启动前、启动中等)。
public interface Lifecycle { String BEFORE_INIT_EVENT = "before_init"; String AFTER_INIT_EVENT = "after_init"; String START_EVENT = "start"; String BEFORE_START_EVENT = "before_start"; String AFTER_START_EVENT = "after_start"; String STOP_EVENT = "stop"; String BEFORE_STOP_EVENT = "before_stop"; String AFTER_STOP_EVENT = "after_stop"; String AFTER_DESTROY_EVENT = "after_destroy"; String BEFORE_DESTROY_EVENT = "before_destroy"; String PERIODIC_EVENT = "periodic"; String CONFIGURE_START_EVENT = "configure_start"; String CONFIGURE_STOP_EVENT = "configure_stop"; void addLifecycleListener(LifecycleListener var1); LifecycleListener[] findLifecycleListeners(); void removeLifecycleListener(LifecycleListener var1); void init() throws LifecycleException; void start() throws LifecycleException; void stop() throws LifecycleException; void destroy() throws LifecycleException; LifecycleState getState(); String getStateName(); public interface SingleUse { }
-
定义三个管理监听器的方法addLifecycleListener、findLifecycleEvent和removeLifecycleListener,分别用来添加、查找和删除LifecycleListener类型的监听器
-
定义4个生命周期的方法:init、start、stop和destroy,用于执行生命周期的各个阶段的操作
-
定义了获取当前 状态的两个方法getState和getStateName,用来获取当前的状态,getState获取的事枚举类型,里面列举了生命周期的各个节点,getStateName方法返回String类型的状态的名字,用于JMX中。
2.2 LifecycleBase
Lifecycle默认实现是LifecycleBase,实现了生命周期的组件都直接或间接地继承自LifecycleBase。
- 监听管理使用了LifecycleSupport类来完成,定义了一个LifecycleListener数组类型的属性来保存所有的监听器,然后定义了添加、删除、查找和执行监听器的方法
- 生命周期方法中设置了相应的状态并调用了相应的模版方法,init、start、stop和destroy对应的模版方法分别是initInternal、startInternal、stopInternal和destroyInternal方法,这四个方法由子类具体实现
- 组件当前的状态在声明周期的四个方法中已经设置好了,直接返回
三个管理监听器的方法
private LifecycleSupport lifecycle = new LifecycleSupport(this);
@Override
public void addLifecycleListener(LifecycleListener listener) {
lifecycle.addLifecycleListener(listener);
}
@Override
public LifecycleListener[] findLifecycleListeners() {
return lifecycle.findLifecycleListeners();
}
@Override
public void removeLifecycleListener(LifecycleListener listener) {
lifecycle.removeLifecycleListener(listener);
}
addLifecycleListener、findLifecycleListeners和removeLifecycleListener分别调用了LifecycleSupport中同名的方法,LifecycleSupport监听器是通过一个数组属性listeners保存的
这三个方法就是对listeners(数组类型)属性进行操作
- 添加时新建比当前数组大一的数组,将原来的数据按顺序保存进去,将新的添加最后,并将新建的数组赋给listeners属性
- 删除时先找到要删除的监听器在数组中的序号,新建一个比当前小一的数组,将除了要删除的监听器所在的序号的元素按顺序添加进入,最后再赋值给listeners属性
private LifecycleListener listeners[] = new LifecycleListener[0];
private final Object listenersLock = new Object(); // Lock object for changes to listeners
public void addLifecycleListener(LifecycleListener listener) {
synchronized (listenersLock) {
LifecycleListener results[] = new LifecycleListener[listeners.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;
}
}
LifecycleSupport中还定义了处理LifecycleEvent实践的fireLifecycleEvent方法,按事件的类型(组件的状态)创建了LifecycleEvent事件,然后遍历所有的监听器进行处理。
public void fireLifecycleEvent(String type, Object data) {
LifecycleEvent event = new LifecycleEvent(lifecycle, type, data);
LifecycleListener interested[] = listeners;
for (int i = 0; i < interested.length; i++)
interested[i].lifecycleEvent(event);
}
四个生命周期方法
四个声明周期方法的实现首先判断当前的状态和要处理的方法是否匹配,不匹配就会执行相应方法使其匹配(在init之前调用start,start方法里检验状态等,还是会先执行init方法),或不处理甚至抛出异常,如果匹配或者处理后匹配了,会调用相应的模版方法并设置相应的状态。
init方法
LifecycleBase中的状态是通过LifecycleState类型的state属性来保存的,最开始初始化值为NEW,如果不为NEW会调用invalidTransition方法抛出异常,其他三个方法也会这样
public final synchronized void init() throws LifecycleException {
//最开始的值必须是NEW,否则会抛出异常
if (!state.equals(LifecycleState.NEW)) {
invalidTransition(Lifecycle.BEFORE_INIT_EVENT);
}
try {
//初始化前将状态设置为INITALIZING
setStateInternal(LifecycleState.INITIALIZING, null, false);
initInternal();
//初始化后将状态设置为INITALIZED
setStateInternal(LifecycleState.INITIALIZED, null, false);
} catch (Throwable t) {
ExceptionUtils.handleThrowable(t);
setStateInternal(LifecycleState.FAILED, null, false);
throw new LifecycleException(
sm.getString("lifecycleBase.initFail",toString()), t);
}
}
start方法
1. 通过状态检查是否已经启动,已启动则打印日志并直接返回
2. 如果没有初始化则先进性初始化,如果启动失败则关闭,如果状态无法吹了则抛出异常
3. 启动前将状态设置为LifecycleState.STARTING_PREP
4. 调用模版方法启动组件
5. 启动失败将状态设置为FALLED并执行stop方法停止
6. 启动状态不是STARTED则抛出异常
7. 成功启动后将状态设置为STARTED
public final synchronized void start() throws LifecycleException {
if (LifecycleState.STARTING_PREP.equals(state) || LifecycleState.STARTING.equals(state) ||
LifecycleState.STARTED.equals(state)) {
if (log.isDebugEnabled()) {
Exception e = new LifecycleException();
log.debug(sm.getString("lifecycleBase.alreadyStarted", toString()), e);
} else if (log.isInfoEnabled()) {
log.info(sm.getString("lifecycleBase.alreadyStarted", toString()));
}
return;
}
if (state.equals(LifecycleState.NEW)) {
init();
} else if (state.equals(LifecycleState.FAILED)) {
stop();
} else if (!state.equals(LifecycleState.INITIALIZED) &&
!state.equals(LifecycleState.STOPPED)) {
invalidTransition(Lifecycle.BEFORE_START_EVENT);
}
try {
setStateInternal(LifecycleState.STARTING_PREP, null, false);
startInternal();
if (state.equals(LifecycleState.FAILED)) {
stop();
} else if (!state.equals(LifecycleState.STARTING)) {
invalidTransition(Lifecycle.AFTER_START_EVENT);
} else {
setStateInternal(LifecycleState.STARTED, null, false);
}
} catch (Throwable t) {
setStateInternal(LifecycleState.FAILED, null, false);
}
}
stop方法
1. 通过状态检查是否已经关闭,已关闭则打印日志并直接返回
2. 如果是NEW状态,将当前state设置为STOPPED并返回
3. 如果状态不是STARTED也不是FAILED则抛出异常
4. 如果当前状态是FAILED则将当前标志为BEFORE_STOP_EVENT事件
5. 调用模版方法进行stop
6. 停止状态不是STOPPING和FAILED则抛出异常
7. 成功启动后将状态设置为STOPPED
8. finally里面执行destory方法
public final synchronized void stop() throws LifecycleException {
if (LifecycleState.STOPPING_PREP.equals(state) || LifecycleState.STOPPING.equals(state) ||
LifecycleState.STOPPED.equals(state)) {
if (log.isDebugEnabled()) {
} else if (log.isInfoEnabled()) {
}
return;
}
if (state.equals(LifecycleState.NEW)) {
state = LifecycleState.STOPPED;
return;
}
if (!state.equals(LifecycleState.STARTED) && !state.equals(LifecycleState.FAILED)) {
invalidTransition(Lifecycle.BEFORE_STOP_EVENT);
}
try {
if (state.equals(LifecycleState.FAILED)) {
fireLifecycleEvent(BEFORE_STOP_EVENT, null);
} else {
setStateInternal(LifecycleState.STOPPING_PREP, null, false);
}
stopInternal();
if (!state.equals(LifecycleState.STOPPING) && !state.equals(LifecycleState.FAILED)) {
invalidTransition(Lifecycle.AFTER_STOP_EVENT);
}
setStateInternal(LifecycleState.STOPPED, null, false);
} catch (Throwable t) {
setStateInternal(LifecycleState.FAILED, null, false);
} finally {
if (this instanceof Lifecycle.SingleUse) {
setStateInternal(LifecycleState.STOPPED, null, false);
destroy();
}
}
}
destory方法
- 如果LifecycleState状态是FAILED则先执行stop方法
- 如果状态是DESTROYING或DESTROYED 记录日志并退出
- 如果状态不是STOPPED、FAILED、NEW、INITIALIZED 抛出异常
- 销毁前将状态设置为LifecycleState.DESTROYING
- 调用模版方法销毁组件
- 销毁后将状态设置为DESTROYED
public final synchronized void destroy() throws LifecycleException {
if (LifecycleState.FAILED.equals(state)) {
try {
stop();
} catch (LifecycleException e) {
}
if (!state.equals(LifecycleState.STOPPED) &&
!state.equals(LifecycleState.FAILED) &&
!state.equals(LifecycleState.NEW) &&
!state.equals(LifecycleState.INITIALIZED)) {
invalidTransition(Lifecycle.BEFORE_DESTROY_EVENT);
}
try {
setStateInternal(LifecycleState.DESTROYING, null, false);
destroyInternal();
setStateInternal(LifecycleState.DESTROYED, null, false);
} catch (Throwable t) {
setStateInternal(LifecycleState.FAILED, null, false);
}
}
setStateInternal()
该方法除了设置状态还检查设置的状态合不合逻辑,并在最后发布相应的事件
private synchronized void setStateInternal(LifecycleState state,
Object data, boolean check) throws LifecycleException {
if (log.isDebugEnabled()) {
log.debug(sm.getString("lifecycleBase.setState", this, state));
}
if (check) {
if (state == null) {
invalidTransition("null");
return;
}
if (!(state == LifecycleState.FAILED ||
(this.state == LifecycleState.STARTING_PREP &&
state == LifecycleState.STARTING) ||
(this.state == LifecycleState.STOPPING_PREP &&
state == LifecycleState.STOPPING) ||
(this.state == LifecycleState.FAILED &&
state == LifecycleState.STOPPING))) {
invalidTransition(state.name());
}
}
this.state = state;
String lifecycleEvent = state.getLifecycleEvent();
if (lifecycleEvent != null) {
fireLifecycleEvent(lifecycleEvent, data);
}
}
fireLifecycleEvent()
处理事件,该方法调用了LifecycleSupport的fireLifecycleEvent方法具体处理
protected void fireLifecycleEvent(String type, Object data) {
lifecycle.fireLifecycleEvent(type, data);
}
invalidTransition()
负责抛出指定状态的异常
private void invalidTransition(String type) throws LifecycleException {
String msg = sm.getString("lifecycleBase.invalidTransition", type,toString(), state);
throw new LifecycleException(msg);
}
两个获取当前状态的方法
在生命周期的相应方法已经将状态设置到了state属性,直接将state返回就可以
public LifecycleState getState() {
return state;
}
@Override
public String getStateName() {
return getState().toString();
}