Tomcat如何啓動整個容器的?

前節回顧

  通過上一節Tomcat架構設計概述我們知道Tomcat容器的整體架構,也都聽過Tomcat的一鍵式啓動模式,即當Catalina啓動時,其包含的這些組件也會一起啓動,同樣,當Catalina關閉時,這些組件也都會隨之關閉。
  接下來,我們將會開始分析Tomcat是如何做到一鍵式啓停的。

啓動流程圖

  Tomcat的大致啓動流程如下:
在這裏插入圖片描述
  也許有人會疑問,怎麼tomcat的啓動流程跟我看到的有點不一樣呢?Catalina不是調用的start()方法嗎?怎麼變成initInternal方法()了。其實呢這裏我是省略了部分信息,只體現了啓動過程中我覺得比較核心的過程。
  還有爲什麼只有一個Container,沒有Engine、Host、Context這些呢?爲了體現簡潔一點,可以理解爲Container包含了所有類型的容器,所有容器都調用了這些方法(但提示一點Host並沒有實現initInternal方法,但這不影響理解整個設計思想)

流程詳解

  由於上述的一個啓動流程圖只是描述了Tomcat中一鍵式啓停的核心部分,其他的邊緣的啓動過程,可以詳見下圖:
在這裏插入圖片描述
  由上圖可知,其實在啓動tomcat的時候我們是直接調用了Server的start()方法,那start方法是怎麼變成調用initInternal()方法和startInternal()方法的呢?
  首先Server的實例的類繼承體系如下:
在這裏插入圖片描述
  通過以上的類繼承體系以及源碼調用,可以知道從start至initInternal的整個調用過程如下:
在這裏插入圖片描述
  tomcat設計上允許一個組件包含另一個組件,例如Server服務器可以包含多個Service服務,多個Listener等,所以tomcat設計由父組件負責啓動/關閉它的子組件,這樣就可以讓所有的組件都置於其父組件的監護之下,也就意味着tomcat只需要啓動一個組件就可以將全部的應用組件都啓動起來。而這種單一啓動/關閉機制就是通過Lifecycle接口實現的。
  所以除了StandardServer之外,其他的所有繼承LifecycleMBeanBase類在被相應的父組件調用時,都會相應的按照上述流程執行initInternal,startInternal。

Lifecycle接口

  Lifecycle接口是所有組件實現生命週期管理的公共接口,提供的方法如下:
在這裏插入圖片描述
  Lifecycle接口中最重要的就是start()和stop()方法,所有的組件都必須提供這兩個方法的實現給其父組件調用,從而實現啓動/關閉操作,而init方法是在執行start方法之前的一些準備工作。
  其他的幾個方法都是與事件監聽有關的,每個組件都可以註冊多個事件來對發生在該組件上的一些事件進行監聽,當某個事件發生時,相應的事件監聽器會收到通知。
  除此之外,還有Lifecycle實例可以觸發的事件。
在這裏插入圖片描述

LifecycleEvent

  所有的生命週期事件都是LifecycleEvent類的實例。
在這裏插入圖片描述

LifecycleListener

  生命週期的事件監聽器是LifecycleListener接口的實例,該接口中只有一個方法,即lifecycleEvent()方法。當某個事件監聽器監聽到相關的事件發生時,就會調用該方法。
在這裏插入圖片描述

LifecycleSupport

  tomcat提供的一個工具類,用來幫助組件管理監聽器,並觸發相應的生命週期事件。所以該類的方法主要就是對監聽器做相關的操作,如添加、查找、刪除監聽器等。
在這裏插入圖片描述

監聽器的調用

  介紹了以上幾種組件,那tomcat在啓動時是怎麼使用的呢?
  首先在初始化每一個Lifecycle實例的時候,會在初始化LfiecycleBase時,將自身實例傳給LifecycleSupport類。
在這裏插入圖片描述
  然後在執行startInternal時,會調用fireLifecycleEvent方法。
在這裏插入圖片描述
  最終調用LifecycleSupport類的fireLifecycleEvent()方法去找到該組件在該狀態需要觸發的監聽器,並調用該監聽器的lifecycleEvent()方法。
在這裏插入圖片描述
  最終在完成整個啓動操作後,tomcat啓動流程完成,接下來便開始監聽端口等待請求。

下節預告

  此時根據結尾,大家會想到下一節,應該是講tomcat是如何處理請求的吧。但是下節我將會先描述一下tomcat是如何擺脫硬編碼,優雅的根據server.xml配置文件創建相應的容器實例的。算是一個小小的學習記錄吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章