概要
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() |* ----»-----------------------------»------------------------------
生命周期状态图
- 当组件在
STARTING_PREP、STARTING或STARTED时,调用start()方法没有任何效果 - 当组件在
NEW状态时,调用start()方法会导致init()方法被立刻执行,随后start()方法被执行 - 当组件在
STOPPING_PREP、STOPPING或STOPPED时,调用stop()方法没有任何效果 - 当一个组件在
NEW状态时,调用stop()方法会将组件状态变更为STOPPED,比较典型的场景就是组件启动失败,其子组件还没有启动。当一个组件停止的时候,它将尝试停止它下面的所有子组件,即使子组件还没有启动。
Lifecycle中的方法
Lifecycle有哪些方法,如下所示:
public interface Lifecycle {// 添加监听器public void addLifecycleListener(LifecycleListener listener);// 获取所以监听器public LifecycleListener[] findLifecycleListeners();// 移除某个监听器public void removeLifecycleListener(LifecycleListener listener);// 初始化方法public void init() throws LifecycleException;// 启动方法public void start() throws LifecycleException;// 停止方法,和start对应public void stop() throws LifecycleException;// 销毁方法,和init对应public void destroy() throws LifecycleException;// 获取生命周期状态public LifecycleState getState();// 获取字符串类型的生命周期状态public String getStateName();}
这些方法基本上都会抛出异常-LifecycleException。同时这些方法都非常简单,也很容易懂,在此不再赘述。
LifecycleBase
LifecycleBase是Lifecycle的基本实现。看下Lifecycle中的方法。
1.增加、删除和获取监听器
private final List<LifecycleListener> lifecycleListeners = new CopyOnWriteArrayList<>();@Overridepublic void addLifecycleListener(LifecycleListener listener) {lifecycleListeners.add(listener);}@Overridepublic LifecycleListener[] findLifecycleListeners() {return lifecycleListeners.toArray(new LifecycleListener[0]);}@Overridepublic void removeLifecycleListener(LifecycleListener listener) {lifecycleListeners.remove(listener);}
- 生命周期监听器保存在一个线程安全的List中,
CopyOnWriteArrayList。所以add和remove都是直接调用此List的相应方法。 - findLifecycleListeners返回的是一个数组,为了线程安全,所以这儿会生成一个新数组。
2.init()
@Overridepublic final synchronized void init() throws LifecycleException {// 非NEW状态,不允许调用init()方法if (!state.equals(LifecycleState.NEW)) {invalidTransition(Lifecycle.BEFORE_INIT_EVENT);}try {// 初始化逻辑之前,先将状态变更为`INITIALIZING`setStateInternal(LifecycleState.INITIALIZING, null, false);// 初始化,该方法为一个abstract方法,需要组件自行实现initInternal();// 初始化完成之后,状态变更为`INITIALIZED`setStateInternal(LifecycleState.INITIALIZED, null, false);} catch (Throwable t) {// 初始化的过程中,可能会有异常抛出,这时需要捕获异常,并将状态变更为`FAILED`ExceptionUtils.handleThrowable(t);setStateInternal(LifecycleState.FAILED, null, false);throw new LifecycleException(sm.getString("lifecycleBase.initFail",toString()), t);}}
再来看看invalidTransition方法,该方法直接抛出异常。
private void invalidTransition(String type) throws LifecycleException {String msg = sm.getString("lifecycleBase.invalidTransition", type,toString(), state);throw new LifecycleException(msg);}
setStateInternal方法用于维护状态,同时在状态转换成功之后触发事件。为了状态的可见性,所以state声明为volatile类型的。
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));}// 是否校验状态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不允许为nullif (state == null) {invalidTransition("null");// Unreachable code - here to stop eclipse complaining about// a possible NPE further down the methodreturn;}// Any method can transition to failed// startInternal() permits STARTING_PREP to STARTING// stopInternal() permits STOPPING_PREP to STOPPING and FAILED to// STOPPINGif (!(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 permittedinvalidTransition(state.name());}}// 设置状态this.state = state;// 触发事件String lifecycleEvent = state.getLifecycleEvent();if (lifecycleEvent != null) {fireLifecycleEvent(lifecycleEvent, data);}}
3.start()
@Overridepublic final synchronized void start() throws LifecycleException {// `STARTING_PREP`、`STARTING`和`STARTED时,将忽略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`状态时,执行init()方法if (state.equals(LifecycleState.NEW)) {init();}// `FAILED`状态时,执行stop()方法else if (state.equals(LifecycleState.FAILED)) {stop();}// 不是`INITIALIZED`和`STOPPED`时,则说明是非法的操作else if (!state.equals(LifecycleState.INITIALIZED) &&!state.equals(LifecycleState.STOPPED)) {invalidTransition(Lifecycle.BEFORE_START_EVENT);}try {// start前的状态设置setStateInternal(LifecycleState.STARTING_PREP, null, false);// start逻辑,抽象方法,由组件自行实现startInternal();// start过程中,可能因为某些原因失败,这时需要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 {// 设置状态为STARTEDsetStateInternal(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);}}
4.stop()
@Overridepublic final synchronized void stop() throws LifecycleException {// `STOPPING_PREP`、`STOPPING`和STOPPED时,将忽略stop()的执行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`状态时,直接将状态变更为`STOPPED`if (state.equals(LifecycleState.NEW)) {state = LifecycleState.STOPPED;return;}// stop()的执行,必须要是`STARTED`和`FAILED`if (!state.equals(LifecycleState.STARTED) && !state.equals(LifecycleState.FAILED)) {invalidTransition(Lifecycle.BEFORE_STOP_EVENT);}try {// `FAILED`时,直接触发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// firedfireLifecycleEvent(BEFORE_STOP_EVENT, null);} else {// 设置状态为STOPPING_PREPsetStateInternal(LifecycleState.STOPPING_PREP, null, false);}// stop逻辑,抽象方法,组件自行实现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);}// 设置状态为STOPPEDsetStateInternal(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 firstsetStateInternal(LifecycleState.STOPPED, null, false);destroy();}}}
5.destroy()
@Overridepublic final synchronized void destroy() throws LifecycleException {// `FAILED`状态时,直接触发stop()逻辑if (LifecycleState.FAILED.equals(state)) {try {// Triggers clean-upstop();} catch (LifecycleException e) {// Just log. Still want to destroy.log.warn(sm.getString("lifecycleBase.destroyStopFail", toString()), e);}}// `DESTROYING`和`DESTROYED`时,忽略destroy的执行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;}// 非法状态判断if (!state.equals(LifecycleState.STOPPED) &&!state.equals(LifecycleState.FAILED) &&!state.equals(LifecycleState.NEW) &&!state.equals(LifecycleState.INITIALIZED)) {invalidTransition(Lifecycle.BEFORE_DESTROY_EVENT);}try {// destroy前状态设置setStateInternal(LifecycleState.DESTROYING, null, false);// 抽象方法,组件自行实现destroyInternal();// destroy后状态设置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);}}
6.模板方法
从上述源码看得出来,LifecycleBase是使用了状态机+模板模式来实现的。模板方法有下面这几个:
// 初始化方法protected abstract void initInternal() throws LifecycleException;// 启动方法protected abstract void startInternal() throws LifecycleException;// 停止方法protected abstract void stopInternal() throws LifecycleException;// 销毁方法protected abstract void destroyInternal() throws LifecycleException;
tomcat启动图

