Tomcat啟動(dòng)分析(八) - Engine組件

本文分析Engine組件,它表示整個(gè)Catalina servlet引擎,可以包含一個(gè)或多個(gè)子容器,如Host或者Context等。

Engine組件

Engine組件表示整個(gè)請(qǐng)求處理的機(jī)構(gòu),它從一個(gè)或多個(gè)Connector中接收并處理請(qǐng)求,并將響應(yīng)返回給Connector。Service元素內(nèi)有且僅能有一個(gè)Engine元素。Engine接口繼承了Container接口,StandardEngine類(lèi)繼承ContainerBase基類(lèi)并實(shí)現(xiàn)了Engine接口,其部分代碼如下所示:

public class StandardEngine extends ContainerBase implements Engine {

    public StandardEngine() {

        super();
        pipeline.setBasic(new StandardEngineValve());
        /* Set the jmvRoute using the system property jvmRoute */
        try {
            setJvmRoute(System.getProperty("jvmRoute"));
        } catch(Exception ex) {
            log.warn(sm.getString("standardEngine.jvmRouteFail"));
        }
        // By default, the engine will hold the reloading thread
        backgroundProcessorDelay = 10;

    }

    private String defaultHost = null;

    private Service service = null;

    @Override
    public String getDefaultHost() {
        return (defaultHost);
    }

    @Override
    public void setDefaultHost(String host) {
        String oldDefaultHost = this.defaultHost;
        if (host == null) {
            this.defaultHost = null;
        } else {
            this.defaultHost = host.toLowerCase(Locale.ENGLISH);
        }
        support.firePropertyChange("defaultHost", oldDefaultHost,
                                   this.defaultHost);
    }

    @Override
    public Service getService() {
        return (this.service);
    }

    @Override
    public void setService(Service service) {
        this.service = service;
    }

    @Override
    public void addChild(Container child) {
        if (!(child instanceof Host))
            throw new IllegalArgumentException
                (sm.getString("standardEngine.notHost"));
        super.addChild(child);
    }
    // 省略一些代碼
}
  • defaultHost表示Engine中的默認(rèn)主機(jī)名,使用servel.xml配置時(shí)必須與一個(gè)Host元素的名稱(chēng)相匹配;
  • service表示該Engine所處的Service;
  • 其余變量的含義可以參考Engine的配置文檔

構(gòu)造函數(shù)為自己的Pipeline添加了基本閥StandardEngineValve。Engine組件沒(méi)有父容器,只有父Service(因?yàn)镋ngine在server.xml中是Service的子元素),addChild方法只能添加Host組件。

組件初始化

初始化時(shí)調(diào)用基類(lèi)ContainerBase的對(duì)應(yīng)方法為自己創(chuàng)建線程池。

@Override
protected void initInternal() throws LifecycleException {
    // Ensure that a Realm is present before any attempt is made to start
    // one. This will create the default NullRealm if necessary.
    getRealm();
    super.initInternal();
}

組件啟動(dòng)

啟動(dòng)時(shí)調(diào)用基類(lèi)ContainerBase的對(duì)應(yīng)方法啟動(dòng)各Host。

@Override
protected synchronized void startInternal() throws LifecycleException {
    // Log our server identification information
    if(log.isInfoEnabled())
        log.info( "Starting Servlet Engine: " + ServerInfo.getServerInfo());
    // Standard container startup
    super.startInternal();
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • Host組件表示一個(gè)虛擬主機(jī),在Host元素內(nèi)可以有多個(gè)Context元素與之關(guān)聯(lián)以表示不同的Web應(yīng)用,Engi...
    buzzerrookie閱讀 1,006評(píng)論 0 1
  • 開(kāi)篇 ?在看《Tomcat 架構(gòu)解析》時(shí)候,對(duì)server.xml的配置文件產(chǎn)生了興趣,剛好在網(wǎng)上搜了搜一些資料,...
    晴天哥_王志閱讀 3,138評(píng)論 1 9
  • 前言 Tomcat隸屬于Apache基金會(huì),是開(kāi)源的輕量級(jí)Web應(yīng)用服務(wù)器,使用非常廣泛。server.xml是T...
    余平的余_余平的平閱讀 2,039評(píng)論 0 23
  • 所有的東西都失去了色彩,誰(shuí)又會(huì)在乎誰(shuí)的存在呢!
    恐血閱讀 123評(píng)論 0 0
  • 活出自己,活出自由,活出夢(mèng)想中的自己,人生才是精彩的,也是不枉我們來(lái)這個(gè)世界走一遭。 有時(shí)候在我們穿衣服買(mǎi)衣服的時(shí)...
    像夢(mèng)中的自己閱讀 633評(píng)論 0 1

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