【Tomcat源碼分析】生命周期機(jī)制 Lifecycle
前言
Tomcat 內(nèi)部,如同精密齒輪般運(yùn)轉(zhuǎn)著各種組件,彼此協(xié)作,構(gòu)建起龐大的 web 服務(wù)器架構(gòu)。在這錯(cuò)綜復(fù)雜的體系中,Lifecycle(生命周期機(jī)制)猶如靈魂,貫穿始終,賦予組件生命,協(xié)調(diào)運(yùn)作。
在深入探究各組件之前,我們不妨先解開 Lifecycle 的神秘面紗,領(lǐng)略它如何賦予組件生命,以及它背后的實(shí)現(xiàn)原理。
什么是 Lifecycle?
Lifecycle,實(shí)則是一臺(tái)精密的狀態(tài)機(jī),以時(shí)間為軸,管理著組件從誕生到消亡的每個(gè)階段。
當(dāng)組件處于STARTING_PREP、STARTING或STARTED狀態(tài)時(shí),調(diào)用 start()方法如同石沉大海,毫無反應(yīng)。
然而,當(dāng)它處于 NEW 狀態(tài)時(shí),調(diào)用start()方法則會(huì)觸發(fā)一系列連鎖反應(yīng):init()方法率先登場(chǎng),緊隨其后的是 start()方法的執(zhí)行。
反之,當(dāng)組件處于STOPPING_PREP、STOPPING或STOPPED狀態(tài)時(shí),調(diào)用 stop()方法亦是徒勞。
但在 NEW 狀態(tài)下,調(diào)用stop()方法則會(huì)將組件直接置于 STOPPED 狀態(tài),這往往發(fā)生在組件啟動(dòng)失敗,其子組件尚未啟動(dòng)的情況下。值得注意的是,當(dāng)一個(gè)組件停止時(shí),它會(huì)竭盡全力嘗試停止其所有子組件,即使這些子組件尚未啟動(dòng)。
Lifecycle 方法
讓我們一同揭開 Lifecycle 的面紗,探尋它擁有的方法,如下:
public interface Lifecycle {
// 添加監(jiān)聽器
public void addLifecycleListener(LifecycleListener listener);
// 獲取所以監(jiān)聽器
public LifecycleListener[] findLifecycleListeners();
// 移除某個(gè)監(jiān)聽器
public void removeLifecycleListener(LifecycleListener listener);
// 初始化方法
public void init() throws LifecycleException;
// 啟動(dòng)方法
public void start() throws LifecycleException;
// 停止方法,和start對(duì)應(yīng)
public void stop() throws LifecycleException;
// 銷毀方法,和init對(duì)應(yīng)
public void destroy() throws LifecycleException;
// 獲取生命周期狀態(tài)
public LifecycleState getState();
// 獲取字符串類型的生命周期狀態(tài)
public String getStateName();
}
LifecycleBase
LifecycleBase是Lifecycle的基石,承載著生命周期的基本實(shí)現(xiàn)。我們一起深入探索 LifecycleBase 的每個(gè)方法:
增加、刪除和獲取監(jiān)聽器
private final List<LifecycleListener> lifecycleListeners = new CopyOnWriteArrayList<>();
@Override
public void addLifecycleListener(LifecycleListener listener) {
lifecycleListeners.add(listener);
}
@Override
public LifecycleListener[] findLifecycleListeners() {
return lifecycleListeners.toArray(new LifecycleListener[0]);
}
@Override
public void removeLifecycleListener(LifecycleListener listener) {
lifecycleListeners.remove(listener);
}
- 生命周期監(jiān)聽器們,守護(hù)著組件的每個(gè)狀態(tài)轉(zhuǎn)變。它們被整齊地排列在一個(gè)線程安全的 CopyOnWriteArrayList 中。無論是添加還是移除監(jiān)聽器,都直接調(diào)用 List 的相應(yīng)方法,保證了操作的安全性。
- 而 findLifecycleListeners 方法則以數(shù)組的形式返回所有監(jiān)聽器。為了確保線程安全,每次調(diào)用該方法時(shí),都會(huì)生成一個(gè)新的數(shù)組,將監(jiān)聽器們復(fù)制其中,避免了并發(fā)修改帶來的風(fēng)險(xiǎn)。
init()
@Override
public final synchronized void init() throws LifecycleException {
// 非NEW狀態(tài),不允許調(diào)用init()方法
if (!state.equals(LifecycleState.NEW)) {
invalidTransition(Lifecycle.BEFORE_INIT_EVENT);
}
try {
// 初始化邏輯之前,先將狀態(tài)變更為`INITIALIZING`
setStateInternal(LifecycleState.INITIALIZING, null, false);
// 初始化,該方法為一個(gè)abstract方法,需要組件自行實(shí)現(xiàn)
initInternal();
// 初始化完成之后,狀態(tài)變更為`INITIALIZED`
setStateInternal(LifecycleState.INITIALIZED, null, false);
} catch (Throwable t) {
// 初始化的過程中,可能會(huì)有異常拋出,這時(shí)需要捕獲異常,并將狀態(tài)變更為`FAILED`
ExceptionUtils.handleThrowable(t);
setStateInternal(LifecycleState.FAILED, null, false);
throw new LifecycleException(
sm.getString("lifecycleBase.initFail",toString()), t);
}
}
setStateInternal 方法,負(fù)責(zé)維護(hù)組件的當(dāng)前狀態(tài)。每一次狀態(tài)轉(zhuǎn)換,都會(huì)經(jīng)過它的仔細(xì)審核,并在轉(zhuǎn)換成功后,它會(huì)向外界發(fā)出通知。
為了保證狀態(tài)的實(shí)時(shí)可見性,state 被聲明為 volatile 類型,確保任何線程對(duì) state 的修改都能立即被其他線程感知,避免出現(xiàn)狀態(tài)滯后的情況。
private volatile LifecycleState state = LifecycleState.NEW;。
private synchronized void setStateInternal(LifecycleState state,
Object data, boolean check) throws LifecycleException {
if (log.isDebugEnabled()) {
log.debug(sm.getString("lifecycleBase.setState", this, state));
}
// 是否校驗(yàn)狀態(tài)
if (check) {
// Must have been triggered by one of the abstract methods (assume
// code in this class is correct)
// null is never a valid state
// state不允許為null
if (state == null) {
invalidTransition("null");
// Unreachable code - here to stop eclipse complaining about
// a possible NPE further down the method
return;
}
// Any method can transition to failed
// startInternal() permits STARTING_PREP to STARTING
// stopInternal() permits STOPPING_PREP to STOPPING and FAILED to
// STOPPING
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))) {
// No other transition permitted
invalidTransition(state.name());
}
}
// 設(shè)置狀態(tài)
this.state = state;
// 觸發(fā)事件
String lifecycleEvent = state.getLifecycleEvent();
if (lifecycleEvent != null) {
fireLifecycleEvent(lifecycleEvent, data);
}
}
看看fireLifecycleEvent方法,
public void fireLifecycleEvent(String type, Object data) {
// 事件監(jiān)聽,觀察者模式的另一種方式
LifecycleEvent event = new LifecycleEvent(lifecycle, type, data);
LifecycleListener interested[] = listeners;// 監(jiān)聽器數(shù)組 關(guān)注 事件(啟動(dòng)或者關(guān)閉事件)
// 循環(huán)通知所有生命周期時(shí)間偵聽器
for (int i = 0; i < interested.length; i++)
// 每個(gè)監(jiān)聽器都有自己的邏輯
interested[i].lifecycleEvent(event);
}
首先, 創(chuàng)建一個(gè)事件對(duì)象, 然通知所有的監(jiān)聽器發(fā)生了該事件.并做響應(yīng).
start()
@Override
public final synchronized void start() throws LifecycleException {
// `STARTING_PREP`、`STARTING`和`STARTED時(shí),將忽略start()邏輯
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;
}
// `NEW`狀態(tài)時(shí),執(zhí)行init()方法
if (state.equals(LifecycleState.NEW)) {
init();
}
// `FAILED`狀態(tài)時(shí),執(zhí)行stop()方法
else if (state.equals(LifecycleState.FAILED)) {
stop();
}
// 不是`INITIALIZED`和`STOPPED`時(shí),則說明是非法的操作
else if (!state.equals(LifecycleState.INITIALIZED) &&
!state.equals(LifecycleState.STOPPED)) {
invalidTransition(Lifecycle.BEFORE_START_EVENT);
}
try {
// start前的狀態(tài)設(shè)置
setStateInternal(LifecycleState.STARTING_PREP, null, false);
// start邏輯,抽象方法,由組件自行實(shí)現(xiàn)
startInternal();
// start過程中,可能因?yàn)槟承┰蚴?,這時(shí)需要stop操作
if (state.equals(LifecycleState.FAILED)) {
// This is a 'controlled' failure. The component put itself into the
// FAILED state so call stop() to complete the clean-up.
stop();
} else if (!state.equals(LifecycleState.STARTING)) {
// Shouldn't be necessary but acts as a check that sub-classes are
// doing what they are supposed to.
invalidTransition(Lifecycle.AFTER_START_EVENT);
} else {
// 設(shè)置狀態(tài)為STARTED
setStateInternal(LifecycleState.STARTED, null, false);
}
} catch (Throwable t) {
// This is an 'uncontrolled' failure so put the component into the
// FAILED state and throw an exception.
ExceptionUtils.handleThrowable(t);
setStateInternal(LifecycleState.FAILED, null, false);
throw new LifecycleException(sm.getString("lifecycleBase.startFail", toString()), t);
}
}
stop()
@Override
public final synchronized void stop() throws LifecycleException {
// `STOPPING_PREP`、`STOPPING`和STOPPED時(shí),將忽略stop()的執(zhí)行
if (LifecycleState.STOPPING_PREP.equals(state) || LifecycleState.STOPPING.equals(state) ||
LifecycleState.STOPPED.equals(state)) {
if (log.isDebugEnabled()) {
Exception e = new LifecycleException();
log.debug(sm.getString("lifecycleBase.alreadyStopped", toString()), e);
} else if (log.isInfoEnabled()) {
log.info(sm.getString("lifecycleBase.alreadyStopped", toString()));
}
return;
}
// `NEW`狀態(tài)時(shí),直接將狀態(tài)變更為`STOPPED`
if (state.equals(LifecycleState.NEW)) {
state = LifecycleState.STOPPED;
return;
}
// stop()的執(zhí)行,必須要是`STARTED`和`FAILED`
if (!state.equals(LifecycleState.STARTED) && !state.equals(LifecycleState.FAILED)) {
invalidTransition(Lifecycle.BEFORE_STOP_EVENT);
}
try {
// `FAILED`時(shí),直接觸發(fā)BEFORE_STOP_EVENT事件
if (state.equals(LifecycleState.FAILED)) {
// Don't transition to STOPPING_PREP as that would briefly mark the
// component as available but do ensure the BEFORE_STOP_EVENT is
// fired
fireLifecycleEvent(BEFORE_STOP_EVENT, null);
} else {
// 設(shè)置狀態(tài)為STOPPING_PREP
setStateInternal(LifecycleState.STOPPING_PREP, null, false);
}
// stop邏輯,抽象方法,組件自行實(shí)現(xiàn)
stopInternal();
// Shouldn't be necessary but acts as a check that sub-classes are
// doing what they are supposed to.
if (!state.equals(LifecycleState.STOPPING) && !state.equals(LifecycleState.FAILED)) {
invalidTransition(Lifecycle.AFTER_STOP_EVENT);
}
// 設(shè)置狀態(tài)為STOPPED
setStateInternal(LifecycleState.STOPPED, null, false);
} catch (Throwable t) {
ExceptionUtils.handleThrowable(t);
setStateInternal(LifecycleState.FAILED, null, false);
throw new LifecycleException(sm.getString("lifecycleBase.stopFail",toString()), t);
} finally {
if (this instanceof Lifecycle.SingleUse) {
// Complete stop process first
setStateInternal(LifecycleState.STOPPED, null, false);
destroy();
}
}
}
destroy()
@Override
public final synchronized void destroy() throws LifecycleException {
// `FAILED`狀態(tài)時(shí),直接觸發(fā)stop()邏輯
if (LifecycleState.FAILED.equals(state)) {
try {
// Triggers clean-up
stop();
} catch (LifecycleException e) {
// Just log. Still want to destroy.
log.warn(sm.getString(
"lifecycleBase.destroyStopFail", toString()), e);
}
}
// `DESTROYING`和`DESTROYED`時(shí),忽略destroy的執(zhí)行
if (LifecycleState.DESTROYING.equals(state) ||
LifecycleState.DESTROYED.equals(state)) {
if (log.isDebugEnabled()) {
Exception e = new LifecycleException();
log.debug(sm.getString("lifecycleBase.alreadyDestroyed", toString()), e);
} else if (log.isInfoEnabled() && !(this instanceof Lifecycle.SingleUse)) {
// Rather than have every component that might need to call
// destroy() check for SingleUse, don't log an info message if
// multiple calls are made to destroy()
log.info(sm.getString("lifecycleBase.alreadyDestroyed", toString()));
}
return;
}
// 非法狀態(tài)判斷
if (!state.equals(LifecycleState.STOPPED) &&
!state.equals(LifecycleState.FAILED) &&
!state.equals(LifecycleState.NEW) &&
!state.equals(LifecycleState.INITIALIZED)) {
invalidTransition(Lifecycle.BEFORE_DESTROY_EVENT);
}
try {
// destroy前狀態(tài)設(shè)置
setStateInternal(LifecycleState.DESTROYING, null, false);
// 抽象方法,組件自行實(shí)現(xiàn)
destroyInternal();
// destroy后狀態(tài)設(shè)置
setStateInternal(LifecycleState.DESTROYED, null, false);
} catch (Throwable t) {
ExceptionUtils.handleThrowable(t);
setStateInternal(LifecycleState.FAILED, null, false);
throw new LifecycleException(
sm.getString("lifecycleBase.destroyFail",toString()), t);
}
}
模板方法
從上述源碼看得出來,LifecycleBase 類巧妙地運(yùn)用了狀態(tài)機(jī)與模板模式的結(jié)合,以構(gòu)筑其功能。
// 初始化方法
protected abstract void initInternal() throws LifecycleException;
// 啟動(dòng)方法
protected abstract void startInternal() throws LifecycleException;
// 停止方法
protected abstract void stopInternal() throws LifecycleException;
// 銷毀方法
protected abstract void destroyInternal() throws LifecycleException;
總結(jié)
Lifecycle,看似簡(jiǎn)單,代碼簡(jiǎn)潔,卻又設(shè)計(jì)精妙,展現(xiàn)出設(shè)計(jì)模式的優(yōu)雅與力量。
深入剖析 Lifecycle 的實(shí)現(xiàn),不僅讓我們對(duì)組件的生命周期有了更深刻的理解,更讓我們從中可以領(lǐng)悟到設(shè)計(jì)模式的精髓,為我們未來設(shè)計(jì)更優(yōu)雅、更強(qiáng)大的系統(tǒng)提供了寶貴的參考。