99热这里有精品-夜夜嗨av色一区二区不卡-亚洲国产精彩中文乱码AV-日本japanese乳偷乱熟

Tomcat工作原理

總體結構

Tomcat 的結構很復雜,但是 Tomcat 也非常的模塊化,找到了 Tomcat 最核心的模塊,您就抓住了 Tomcat 的“七寸”。下面是 Tomcat 的總體結構圖:

從 上圖中可以看出 Tomcat 的心臟是兩個組件:Connector 和 Container,關于這兩個組件將在后面詳細介紹。Connector 組件是可以被替換,這樣可以提供給服務器設計者更多的選擇,因為這個組件是如此重要,不僅跟服務器的設計的本身,而且和不同的應用場景也十分相關,所以一 個 Container 可以選擇對應多個 Connector。多個 Connector 和一個 Container 就形成了一個 Service,Service 的概念大家都很熟悉了,有了 Service 就可以對外提供服務了,但是 Service 還要一個生存的環境,必須要有人能夠給她生命、掌握其生死大權,那就非 Server 莫屬了。所以整個 Tomcat 的生命周期由 Server 控制。

以 Service 作為“婚姻”

我們將 Tomcat 中 Connector、Container 作為一個整體比作一對情侶的話,Connector 主要負責對外交流,可以比作為 Boy,Container 主要處理 Connector 接受的請求,主要是處理內部事務,可以比作為 Girl。那么這個 Service 就是連接這對男女的結婚證了。是 Service 將它們連接在一起,共同組成一個家庭。當然要組成一個家庭還要很多其它的元素。

說白 了,Service 只是在 Connector 和 Container 外面多包一層,把它們組裝在一起,向外面提供服務,一個 Service 可以設置多個 Connector,但是只能有一個 Container 容器。這個 Service 接口的方法列表如下:

從 Service 接口中定義的方法中可以看出,它主要是為了關聯 Connector 和 Container,同時會初始化它下面的其它組件,注意接口中它并沒有規定一定要控制它下面的組件的生命周期。所有組件的生命周期在一個 Lifecycle 的接口中控制,這里用到了一個重要的設計模式,關于這個接口將在后面介紹。

Tomcat 中 Service 接口的標準實現類是 StandardService 它不僅實現了 Service 借口同時還實現了 Lifecycle 接口,這樣它就可以控制它下面的組件的生命周期了。StandardService 類結構圖如下:

從 上圖中可以看出除了 Service 接口的方法的實現以及控制組件生命周期的 Lifecycle 接口的實現,還有幾個方法是用于在事件監聽的方法的實現,不僅是這個 Service 組件,Tomcat 中其它組件也同樣有這幾個方法,這也是一個典型的設計模式,將在后面介紹。

下面看一下 StandardService 中主要的幾個方法實現的代碼,下面是 setContainer 和 addConnector 方法的源碼:

public void setContainer(Container container) {

????Container oldContainer = this.container;

????if ((oldContainer != null) && (oldContainer instanceof Engine))

????????((Engine) oldContainer).setService(null);

????this.container = container;

????if ((this.container != null) && (this.container instanceof Engine))

????????((Engine) this.container).setService(this);

????if (started && (this.container != null) && (this.container instanceof Lifecycle)) {

????????try {

????????????((Lifecycle) this.container).start();

????????} catch (LifecycleException e) {

????????????;

????????}

????}

????synchronized (connectors) {

????????for (int i = 0; i < connectors.length; i++)

????????????connectors[i].setContainer(this.container);

????}

????if (started && (oldContainer != null) && (oldContainer instanceof Lifecycle)) {

????????try {

????????????((Lifecycle) oldContainer).stop();

????????} catch (LifecycleException e) {

????????????;

????????}

????}

????support.firePropertyChange("container", oldContainer, this.container);

}

這段代碼很簡單,其實就是先判斷當前的這個 Service 有沒有已經關聯了 Container,如果已經關聯了,那么去掉這個關聯關系—— oldContainer.setService(null)。如果這個 oldContainer 已經被啟動了,結束它的生命周期。然后再替換新的關聯、再初始化并開始這個新的 Container 的生命周期。最后將這個過程通知感興趣的事件監聽程序。這里值得注意的地方就是,修改 Container 時要將新的 Container 關聯到每個 Connector,還好 Container 和 Connector 沒有雙向關聯,不然這個關聯關系將會很難維護。

public void addConnector(Connector connector) {

????synchronized (connectors) {

????????connector.setContainer(this.container);

????????connector.setService(this);

????????Connector results[] = new Connector[connectors.length + 1];

????????System.arraycopy(connectors, 0, results, 0, connectors.length);

????????results[connectors.length] = connector;

????????connectors = results;

????????if (initialized) {

????????????try {

????????????????connector.initialize();

????????????} catch (LifecycleException e) {

????????????????e.printStackTrace(System.err);

????????????}

????????}

????????if (started && (connector instanceof Lifecycle)) {

????????????try {

????????????????((Lifecycle) connector).start();

????????????} catch (LifecycleException e) {

????????????????;

????????????}

????????}

????????support.firePropertyChange("connector", null, connector);

????}

}

上面是 addConnector 方法,這個方法也很簡單,首先是設置關聯關系,然后是初始化工作,開始新的生命周期。這里值得一提的是,注意 Connector 用的是數組而不是 List 集合,這個從性能角度考慮可以理解,有趣的是這里用了數組但是并沒有向我們平常那樣,一開始就分配一個固定大小的數組,它這里的實現機制是:重新創建一個 當前大小的數組對象,然后將原來的數組對象 copy 到新的數組中,這種方式實現了類似的動態數組的功能,這種實現方式,值得我們以后拿來借鑒。

最新的 Tomcat6 中 StandardService 也基本沒有變化,但是從 Tomcat5 開始 Service、Server 和容器類都繼承了 MBeanRegistration 接口,Mbeans 的管理更加合理。

行唐县| 章丘市| 南城县| 长沙市| 治多县| 漯河市| 阳信县| 水城县| 岳普湖县| 陵水| 祁连县| 平利县| 丰顺县| 白玉县| 安阳县| 大洼县| 剑川县| 寿光市| 滁州市| 梁河县| 丹东市| 双牌县| 视频| 连江县| 曲靖市| 牡丹江市| 江川县| 黎城县| 奈曼旗| 信阳市| 明光市| 崇义县| 乐陵市| 友谊县| 沙河市| 咸阳市| 页游| 吉木乃县| 江孜县| 扶余县| 磴口县|