1. 程式人生 > >Tomcat原始碼分析--一次HTTP請求過程

Tomcat原始碼分析--一次HTTP請求過程

       前兩篇我們分析了Tomcat服務的啟動過程和Connector(聯結器)。現在讓我們看看一次Tomcat伺服器是怎麼提供HTTP服務的。

       上文我們說到endpoint是底層處理I/O具體實現類,那麼一次HTTP首先也要從這個類中開始。還是以NIOEndPoint實現類為例子。在NIOEndPoint類中有一個名為Acceptor內部類。該內部類負責接收即將到來的TCP/IP連線,並將它們分配給合適的processor處理。
這裡寫圖片描述
HTTP底層是TCP協議,Java實現TCP協議的具體的方式就是Socket連線。我相信只要瞭解一點Java網路程式設計方面的知識都會了解的,不在累述。另一個比較重要的方法是setSocketOptions(),該方法是將socket連線新增到一個快取佇列裡面。這裡使用的是生產者和消費者模式,如果對該模式有不瞭解,請看我的另一個博文,Java併發之生產者和消費者模型

http://blog.csdn.net/c275046758/article/details/50492107

這裡寫圖片描述
setSocketOptions方法內獲得了channel。channel是java nio中的概念,有不瞭解的請檢視Java nio的相關內容。然後在register()方法中將channel新增到快取佇列中。

這裡寫圖片描述

addEvent方法是內部類poller內的一個私有方法。為了能看的更清晰,故將這兩個方法放在一起呈現。

這裡寫圖片描述

Poller類實現了Runnable介面,是一個執行緒類。在run方法的15-31行中具體實現了java nio的一些程式碼。28行繼續呼叫了processKey方法。接著呼叫了processSocket()方法。
這裡寫圖片描述

這裡寫圖片描述

在processSocket方法中,將具體的nio連線轉換成socketProcessor處理執行緒。這個類是一個工作執行緒。可以將其理解成生產者消費者模型中的消費者。然後通過executor執行這個執行緒。

這裡寫圖片描述

從上一篇中我們知道handler是處理協議的地方。process方法在AbstractProcessorLight中的實現。AbstractProcessorLight是一個輕量級的抽象processor實現。

這裡寫圖片描述

接著會呼叫service方法。看到這個方法是不是會有種莫名的激動,是不是servlet的生命週期方法service方法很像呢。彆著急,讓我們看看service的具體實現。

這裡寫圖片描述

在前面經過複雜的處理後,在程式碼的26行呼叫了service方法,而它的引數正好是request和response。正好是service()生命週期方法。

自己研究原始碼的一點心得,如有錯誤請批評指正。