Tomcat啟動過程(三):從SocketProcessor到Container

mingziday發表於2016-03-14

1、Http11Protocol中的內部類Http11ConnectionHandler,執行其process方法

if (processor == null) {
   processor = createProcessor();
  }
SocketState state = processor.process(socket);//交給processor處理

2、上面的processor為Http11NioProcessor類的例項,在其process方法中,會呼叫介面卡adapter進行資料的處理

 adapter.service(request, response);

 

這裡的adapter實際為CoyoteAdapter型別的例項,該adapter的作用就是作為從connector到container的入口來使用的

3、下面是adapter的處理過程,從該適配的connector中獲取容器,進入容器的管道處理流程

public void service(org.apache.coyote.Request req,org.apache.coyote.Response res)throws Exception {
  Request request = (Request) req.getNote(ADAPTER_NOTES);
  Response response = (Response) res.getNote(ADAPTER_NOTES);
  // Parse and set Catalina and configuration specific
  // request parameters
  req.getRequestProcessor().setWorkerThreadName(Thread.currentThread().getName());
  if (postParseRequest(req, request, res, response)) {//postParseRequest用來解析request請求
       connector.getContainer().getPipeline().getFirst().invoke(request, response);//這裡開始進入容器的處理過程,返回結果為response
    }
  ……
}

 

4、進入容器container處理後,就要使用到容器的一個重要的結構:管道pipeline。每個容器類元件都有一個pipeline屬性,這個屬性控制請求的處理過程,在pipeline上可以新增Valve,進而可以控制請求的處理流程。可以將請求想象成水的流動,請求需要在各個元件之間流動,中間經過若干的水管和水閥,等所有的水閥走完,請求也就處理完了,而每個元件都會有一個預設的水閥(以Standard作為類的字首)來進行請求的處理,如果業務需要的話,可以自定義Valve,將其安裝到容器中。

下面是對整個流程的一些圖解,可以很形象地用來幫助理解:整個流程的最終目的就是走到Wrapper的地方,找到正確的Servlet,執行對應的過濾器和doService方法,返回response

相關文章