1. 程式人生 > >知識小罐頭09(tomcat8啟動原始碼分析 下)

知識小罐頭09(tomcat8啟動原始碼分析 下)

  初始化已經完成,現在就是啟動這些元件,Tomcat中的start方法就是用於啟動的,其實start的原理還是和上一篇說的初始化幾乎一樣!這裡我就大概說一下,看幾個比較關鍵的地方就行了。

  前面的步驟就大概截圖看一下就ok了

 

  ok,由於前面這些東西基本和初始化的流程一樣,跳過,我們就從啟動service開始看;

  其實關鍵就是這三步,啟動引擎,監聽器和聯結器,我們好好看看這三步其中的原理。

 

1.啟動引擎

  engine.start()方法其實就是到StandardEngine中startInternal()方法,然後會先執行父類的startInternal()方法

 

  看看父類的一些關鍵的地方(其實都是安全驗證,準備好非同步執行緒去執行從聯結器傳過來的請求和響應物件,這些不是我們的重點)

 

  最後是到StandardPipeline中的startInternal方法

 

2.啟動監聽器

  

  還記得上一篇初始化說的只是初始化了engine,那些Host,Context,Wrapper還沒有初始化呢!其實就是在這裡進行初始化

 

   我們就重點看看上圖的最後一個方法registerHost(host),看看是怎麼註冊的,其實可以發現就是一層一層的到Wrapper

 

 3.啟動聯結器

 

  這個startInternal中無非是設定一下nio的快取,nioChannels,以及poller執行緒,以及啟動Acceptor的執行緒

 

   ok,到這裡可以說是所有的容器該啟動的已經全部啟動,各種各樣的執行緒池,非同步執行緒,輪詢執行緒等等也準備就緒

 

4.await() 

  最後就是await()方法了,這個方法在Catalina的start方法內部

 

  先是獲取整個伺服器server,然後在server中建立server socket進行等待;

 

 

   至此,Tomcat中的所有元件就已經全部啟動了,只要瀏覽器去訪問tomcat,伺服器就會接受到請求,然後會有執行緒會處理這個請求(這裡會涉及到nio,nio結構圖如下;就是會將這些請求的socket放到一個叫做seletor中並且有個key與之對應,selector中會有一個執行緒每次都去訪問各個socket看看有沒有讀寫操作,有的話就通過key找到對應的socket並利用快取進行處理),這裡nio只是隨意說一下,東西太多三言兩語說不清楚,後面可能會寫一篇關於bio,nio,aio的文章。