最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Tomcat處理請求的流程

 更新時間:2023年05月26日 11:11:38   作者:單手入天象  
本文主要介紹了Tomcat處理請求的流程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一、組件詳解

在Tomcat處理客戶端請求的過程中,這里面有三個組件概念,他們都是線程,分別負(fù)責(zé)不同的職責(zé)。
(必須記清楚這三個線程組件)

Acceptor

一個普通線程任務(wù),用于接收新連接,并將新連接封裝,選擇一個 Poller 將新連接添加到 Poller 的事件隊列中。

Poller

一個線程任務(wù),用于監(jiān)聽 Socket 事件,當(dāng)有任務(wù)來臨時,將 Socket 封裝,添加到 worker 線程池的任務(wù)隊列中。

Worker

他是創(chuàng)建一組線程的,每個線程任務(wù)都是一個阻塞隊列,用于對請求進(jìn)行處理(例如我們中間件參數(shù)中的最大線程數(shù)就是指最多創(chuàng)建多少個Worker線程)。每個Worker線程任務(wù)包括分析解析請求報文、創(chuàng)建 Request 對象、調(diào)用容器的 管道pipeline 執(zhí)行閥門value、執(zhí)行servlet的具體邏輯。

二、請求處理流程

1.總體流程圖

2.Worker線程任務(wù)流程

三、源碼跟蹤

1.Tomcat啟動線程組件

Tomcat啟動時,如果默認(rèn)使用NIO模式,先是執(zhí)行了AbstractEndpoint.initServerSocket,通過 ServerSocketChannel.open() 打開一個 ServerSocket通道,默認(rèn)綁定到 8080 端口,用于監(jiān)聽請求。

說明:在Java語言的NIO中,類ServerSocketChannel就是用來處理TPC連接的客戶端,他的open方法就是用例建立一個TPC連接。

然后Tomcat會創(chuàng)建Worker 線程池、Acceptor線程、Poller線程:

AbstractEndpoint.createExecutor,用于創(chuàng)建 Worker 線程池,這個線程池是用來處理實際的請求的,把配置文件中的初始線程數(shù)10、最大線程數(shù)200等信息傳進(jìn)去,創(chuàng)建一個線程池executor

AbstractEndpoint.createExecutor.startAcceptorThread,他創(chuàng)建一個線程任務(wù)Acceptor,作為一個接收者,線程用來無限循環(huán)接受客戶端發(fā)送過來的連接請求

NioEndpoint.startInternal,創(chuàng)建一個線程任務(wù)Poller,用于檢測Acceptor接獸并處理成已就緒的 Socket。

2.Acceptor

Tomcat啟動完成后,客戶端發(fā)起一個請求

Acceptor的run方法,無限循環(huán)在這里接受連接請求
(假如啟動后客戶端發(fā)起一個請求,這里就是第一時間捕獲到)

點進(jìn)去NioEndpoint.serverSocketAccept(因為使用NIO模式),可以看到我們熟悉的nio的accept方法,這是一個阻塞的方法,會一直等待接收請求。

當(dāng)Acceptor接收到客戶端的請求時,調(diào)用addEvent() 方法會將 Socket 添加到該 Poller 的 PollerEvent 隊列中。并調(diào)用了NIO中selector.wakeup方法,喚醒了Poller。到此,這一次請求中 Acceptor 的任務(wù)就完成了。

3.Poller

接著到Poller 線程了,Poller 線程1秒阻塞一次,等待有請求過來被喚醒后,每次請求先過AbstractEndpoint.processSocket

從處理器緩存中獲取當(dāng)前要被執(zhí)行的任務(wù),放進(jìn)任務(wù)進(jìn)程,然后獲取Worker線程組,將這個任務(wù)放進(jìn)去。到此 Poller 的任務(wù)就完成了。

4.Worker

然后就是到Worker線程組了,這次請求的后續(xù)的所有操作都在這個線程中完成。Worker線程是一個阻塞隊列,它繼承自AbstractQueuedSynchronizer。worker 線程被創(chuàng)建以后就執(zhí)行 ThreadPoolExecutor 的 runWorker() 方法,試圖從 workQueue 中取待處理任務(wù),但是一開始 workQueue 是空的,所以 worker 線程會阻塞在 workQueue.take() 方法。

當(dāng)新任務(wù)添加到 workQueue后,workQueue.take() 阻塞就會結(jié)束,會返回一個 Runnable,通常是 SocketWrapperBase,然后 worker 線程調(diào)用 SocketWrapperBase的 run() 方法對 Socket 進(jìn)行處理。

執(zhí)行SocketWrapperBase.run

里面調(diào)用的是 doRun方法,他是抽象方法,根據(jù)當(dāng)前Tomcat使用的模式是NIO還是APR去選擇執(zhí)行不同的方法(默認(rèn)是NIO執(zhí)行NioEndpoint里的內(nèi)部類SocketProcessor.doRun)

這個socket處理器先做TPC的三次握手

三次握手,這里Tomcat作為服務(wù)端,是需要響應(yīng)(執(zhí)行)兩次的,源碼斷點發(fā)現(xiàn)每次http請求這里都是執(zhí)行兩次

三次握手中該方法執(zhí)行兩次:

第一次執(zhí)行時event對象是null,執(zhí)行完是OPEN_READ,表示數(shù)據(jù)可供客戶端讀取

第二次執(zhí)行時event對象是OPEN_READ,如果停用長連接,執(zhí)行完返回的是CLOSE,關(guān)閉連接,否則不關(guān)閉
走到下面,他是獲取協(xié)議處理器,并執(zhí)行他的process方法

執(zhí)行AbstractProtocol.process

可以看到他是獲取的Http11Processor,因為默認(rèn)用的協(xié)議是http1.1

下面執(zhí)行這個處理器的process方法

跟進(jìn)去AbstractProcessorLight.process,然后到了Http11Processor.service,service方法先是從當(dāng)前請求request中,解析請求行、請求頭、請求體,封裝成Request對象

下面獲取adapter(CoyoteAdaptor),調(diào)用service方法

執(zhí)行CoyoteAdaptor.service

獲取到Request和Response并封裝

然后調(diào)用postParseRequest方法,在 Mapper 中查詢 URL 的映射關(guān)系

下面把封裝成的Request對象和響應(yīng)的Response對象傳遞給Engine容器,然后獲取他的管道,執(zhí)行里面綁定的閥門value

按順序執(zhí)行多個閥門,實現(xiàn)對應(yīng)的功能

最后執(zhí)行到StandardWrapperValve.invoke

將Servlet封裝到FilterChain過濾器鏈中

他是定位到ApplicationFilterChain.doFilter,里面先是執(zhí)行了Tomcat內(nèi)置的過濾器

下面執(zhí)行了servlet.service

然后這里就是去調(diào)用我們熟悉的HttpServlet的service方法,解析里面對應(yīng)的doGet方法,或者doPost方法等等… ,也就是執(zhí)行具體業(yè)務(wù)方法。

最后由Servlet將響應(yīng)返回給了客戶端。

總結(jié)

到此這篇關(guān)于Tomcat處理請求的流程的文章就介紹到這了,更多相關(guān)Tomcat處理請求內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Tomcat服務(wù)器的配置與啟動全過程

    Tomcat服務(wù)器的配置與啟動全過程

    這篇文章主要介紹了Tomcat服務(wù)器的配置與啟動全過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Tomcat輸出控制臺中文亂碼問題分析及解決過程

    Tomcat輸出控制臺中文亂碼問題分析及解決過程

    本文介紹了如何解決Tomcat控制臺亂碼問題,出現(xiàn)亂碼的原因是啟動Tomcat時使用的cmd默認(rèn)編碼不是utf-8,可以通過修改注冊表或創(chuàng)建batch腳本來解決,重啟Tomcat后即可正常運行
    2025-11-11
  • 如何驗證Tomcat Gzip配置是否生效的方法

    如何驗證Tomcat Gzip配置是否生效的方法

    這篇文章主要介紹了如何驗證Tomcat Gzip配置是否生效的方法,需要的朋友可以參考下
    2017-03-03
  • Tomcat進(jìn)程占用CPU過高的解決方法

    Tomcat進(jìn)程占用CPU過高的解決方法

    本文主要介紹了Tomcat進(jìn)程占用CPU過高的解決方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • 源碼剖析Tomcat類的加載原理

    源碼剖析Tomcat類的加載原理

    這篇文章主要帶大家從源碼級深入剖析一下Tomcat類的加載原理,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-06-06
  • 如何通過LambdaProbe實現(xiàn)監(jiān)控Tomcat

    如何通過LambdaProbe實現(xiàn)監(jiān)控Tomcat

    這篇文章主要介紹了如何通過LambdaProbe實現(xiàn)監(jiān)控Tomcat,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-10-10
  • 深入了解tomcat中servlet的創(chuàng)建方式實現(xiàn)

    深入了解tomcat中servlet的創(chuàng)建方式實現(xiàn)

    這篇文章主要介紹了深入了解tomcat中servlet的創(chuàng)建方式實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • 圖解Linux下安裝Tomcat服務(wù)器

    圖解Linux下安裝Tomcat服務(wù)器

    這篇文章主要以圖文結(jié)合的方式為大家詳細(xì)介紹了Linux下安裝Tomcat服務(wù)器的詳細(xì)過程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • tomcat啟動報錯:java.util.zip.ZipException的解決方法

    tomcat啟動報錯:java.util.zip.ZipException的解決方法

    這篇文章主要給大家介紹了關(guān)于tomcat啟動報:java.util.zip.ZipException錯誤的解決方法,文中通過示例代碼介紹的非常詳細(xì),同樣遇到這個問題的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-08-08
  • tomcat 配置圖片虛擬路徑不起作用解決辦法

    tomcat 配置圖片虛擬路徑不起作用解決辦法

    這篇文章主要介紹了 tomcat 配置圖片虛擬路徑不起作用解決辦法的相關(guān)資料,需要的朋友可以參考下
    2017-04-04

最新評論

东台市| 温州市| 东乡| 周至县| 碌曲县| 驻马店市| 集贤县| 团风县| 长治县| 天等县| 平安县| 凉城县| 虎林市| 西乌珠穆沁旗| 滦南县| 靖安县| 东明县| 民勤县| 澎湖县| 诸暨市| 营口市| 博湖县| 施秉县| 保亭| 迁安市| 平罗县| 登封市| 深泽县| 藁城市| 南部县| 应城市| 临江市| 定日县| 云阳县| 沧州市| 靖西县| 肥乡县| 崇明县| 青阳县| 淳化县| 高雄县|