Tomcat學(xué)習(xí)筆記之啟動分析(Service)(五)

前言

通過上面一篇的介紹,我們開始分析Service的啟動過程。

initInternal()方法

protected void initInternal() throws LifecycleException {
        super.initInternal();
        //1. 初始化engine容器
        if (engine != null) {
            engine.init();
        }
        // 2. 初始化線程池
        for (Executor executor : findExecutors()) {
            if (executor instanceof JmxEnabled) {
                ((JmxEnabled) executor).setDomain(getDomain());
            }
            executor.init();
        }
        //3. 初始化mapperListener
        mapperListener.init();
        //4. 初始化connectors
        synchronized (connectorsLock) {
            for (Connector connector : connectors) {
                connector.init();
            }
        }
    }

流程比較清晰,不做詳細(xì)介紹。這里看下幾個初始化的容器:

  1. Engine
    Engine容器表示一個特定的Service的請求處理流水線。每個Service只能包含一個,一個Service可以有多個連接器(Connector),Engine從連接器接收和處理所有的請求,將響應(yīng)返回給適合的連接器,通過連接器傳輸給用戶。
    Engine容器包含Host,Host包含Context,Context包含Wrapper,而它們都屬于Container容器。
    由于后面會專門介紹,這里僅做了解。
  2. Executor
    Service中有一個屬性executors,從service.xml讀取,所以我們可以從service.xml看到:
 <!--
    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
        maxThreads="150" minSpareThreads="4"/>
    -->

默認(rèn)是注釋掉的,所以我們這里也不做介紹。

  1. MapperListener
    MapperListener主要作用如下:
    通過監(jiān)聽容器的AFTER_START_EVENT事件來對容器進(jìn)行注冊;
    通過監(jiān)聽容器的BEFORE_STOP_EVENT事件來完成對容器的取消注冊。
    與MapperListener對應(yīng)出現(xiàn)的還有Mapper,而Mapper作為uri映射到容器的工具,扮演的角色就是一個映射組件。它會緩存所有容器信息(包括容器名稱、容器本身、容器層級等等),同時提供映射規(guī)則,將一個uri按照映射規(guī)則映射到具體的Host、Context和Wrapper,并最終通過Wrapper找到邏輯處理單元Servlet。

  2. Connectors
    上面也提到過,作為Tomcat重要的一部分,連接器。用來接受用戶的請求,后面會分析。

startInternal()方法

protected void startInternal() throws LifecycleException {

        if(log.isInfoEnabled())
            log.info(sm.getString("standardService.start.name", this.name));
        //1. 設(shè)置狀態(tài),并發(fā)送通知
        setState(LifecycleState.STARTING);

        //2. 啟動engine容器
        if (engine != null) {
            synchronized (engine) {
                engine.start();
            }
        }
        //2. 啟動線程池
        synchronized (executors) {
            for (Executor executor: executors) {
                executor.start();
            }
        }
        //3. 啟動mapperListener
        mapperListener.start();

        //4. 啟動連接器
        synchronized (connectorsLock) {
            for (Connector connector: connectors) {
                // If it has already failed, don't try and start it
                if (connector.getState() != LifecycleState.FAILED) {
                    connector.start();
                }
            }
        }
    }

主要流程如下:

  • 啟動Engine容器;
  • 啟動線程池;
  • 啟動MapperListener;
  • 啟動連接器Connector。

總結(jié)

到這里,Server->Service全部啟動完成,下面主要來分析兩大組件,Connector連接器和Container容器。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容