當前位置:編程學習大全網 - 源碼下載 - tomcat 請求分析 Processor和Request復用

tomcat 請求分析 Processor和Request復用

Tomcat詳解(5)---Connector 分析 該文講解了BIO、NIO下Connector的行為、

本文將以BIO,HTTP1.1的視角來閱讀源碼。

妳需要知道 Connector的Acceptor線程接收新連接(socket),會創建SocketProcessor來處理後續請求 。如果不知道,請閱讀:

本文將講解接收新連接後,SocketProcessor如何處理後續請求的,以及"Processor"和"Request"的復用。圖解如下:

在獲取新連接後, SocketProcessor是用來處理壹次請求的

我們先記住壹個概念:

我們來看看SocketProcessor.run:

做的事情概括如下:

(synchronized用來對socket進行同步,畢竟會在新舊SocketProcessor之間移交)

然後我們要分析 handler.process 的行為。

其process方法是繼承自AbstractProtocol的,我們分析壹下:

我先說明幾個變量/函數的用途,以便講解:

recycledProcessors是壹個並發隊列,它所存的元素是用來處理接下來的請求的。通過 recycledProcessors.poll(); 取出壹個processor(如果沒有則調用 createProcessor() 創建壹個),調用 processor.process 處理後面的請求,最後再調用 release(wrapper, processor, false, true); 把其內各個變量重置清空(而不是釋放內存。這是為了避免反復申請內存)。

關於 release(wrapper, processor, false, true); 重置變量這壹點,我進壹步說明。讓我們看下Http11Protocol.Http11ConnectionHandler.release:

關於兩行函數調用的作用,我加註釋說明了。我們再看recycle的實現。processor類型是Http11Processor,但recycle是在父類AbstractHttp11Processor裏實現的:

其函數大致如下:

就是通過調用 recycle() 、設為-1或false, 把壹堆變量給重置為初始狀態,但涉及數組的內存都沒有釋放掉 。如果妳還是不確定 recycle() 的行為,可自行跟蹤查看,沒必要在此耗費太多筆墨。

我們取 getInputBuffer().recycle(); 看下源碼AbstractInputBuffer.recycle:

其中涉及了request的重置。說明 Request是會回收,循環利用的

該文明確了以下幾點:

  • 上一篇:Python中Turtle模塊的基本指令都有哪些
  • 下一篇:module failed to initialize怎麽解決
  • copyright 2024編程學習大全網