知識小罐頭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的文章。