成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

【Tomcat源碼分析】生命周期機(jī)制 Lifecycle

開發(fā) 前端
Lifecycle,實(shí)則是一臺(tái)精密的狀態(tài)機(jī),以時(shí)間為軸,管理著組件從誕生到消亡的每個(gè)階段。當(dāng)組件處于STARTING_PREP、STARTING或STARTED狀態(tài)時(shí),調(diào)用 start()方法如同石沉大海,毫無反應(yīng)。

前言

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);
}
  1. 生命周期監(jiān)聽器們,守護(hù)著組件的每個(gè)狀態(tài)轉(zhuǎn)變。它們被整齊地排列在一個(gè)線程安全的 CopyOnWriteArrayList 中。無論是添加還是移除監(jiān)聽器,都直接調(diào)用 List 的相應(yīng)方法,保證了操作的安全性。
  2. 而 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)提供了寶貴的參考。

責(zé)任編輯:武曉燕 來源: 碼上遇見你
相關(guān)推薦

2021-09-03 07:27:38

AndroidGlide管理

2022-10-21 11:30:42

用戶生命周期分析

2015-07-08 16:28:23

weak生命周期

2022-04-19 07:20:24

軟件開發(fā)安全生命周期SSDLC應(yīng)用安全

2012-06-20 10:29:16

敏捷開發(fā)

2009-06-24 10:47:55

JSF生命周期

2013-08-19 17:03:00

.Net生命周期對(duì)象

2021-07-19 05:52:29

網(wǎng)絡(luò)生命周期網(wǎng)絡(luò)框架

2009-06-11 11:28:35

JSF生命周期

2010-07-14 10:48:37

Perl線程

2021-08-24 07:53:28

AndroidActivity生命周期

2024-10-08 08:14:08

用戶生命周期分析服務(wù)

2023-10-07 00:05:07

2009-06-18 13:32:39

Java線程生命周期

2012-04-28 13:23:12

Java生命周期

2014-07-16 13:39:30

Windows Pho

2013-08-01 09:40:51

Windows 8.1

2011-06-16 09:31:21

ActivityAndroid

2023-09-12 10:52:16

OpenSSL開源套件

2019-10-16 10:50:13

Linux內(nèi)核測(cè)試
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 亚洲v日韩v综合v精品v | 自拍偷拍一区二区三区 | 亚洲精品91 | 久久99精品久久久久久国产越南 | 免费中文字幕日韩欧美 | 九九九视频在线 | 久久久久国 | 国产伦一区二区三区久久 | 一区二区电影网 | 亚洲欧美v | 免费成人在线网站 | 久久一区精品 | 成人精品鲁一区一区二区 | 久久久亚洲一区 | 国产午夜精品久久久久免费视高清 | 综合一区| 成人视屏在线观看 | 日韩一级免费观看 | 日本久久精 | 久久草在线视频 | 国产精品不卡一区二区三区 | 在线观看av中文字幕 | 成人毛片在线视频 | 精品免费观看 | 日韩中文字幕 | 久久99精品久久久久久秒播九色 | 国产成人精品久久二区二区 | 在线成人免费视频 | www.天堂av.com | 国产一区二区三区欧美 | 精品av天堂毛片久久久借种 | 粉色午夜视频 | 欧美激情久久久 | 黄色毛片免费看 | 四虎最新| 黄色一级大片视频 | 国产不卡在线观看 | 欧美一级黄带 | 亚洲色欧美另类 | 97精品国产| 国产特级毛片aaaaaa |