天天看點

Tomcat的管道

Tomcat中按照包含關系一共有四個容器——StandardEngine、StandardHost、StandardContext和StandardWrapper,對這四個容器的詳細解析後面會涉及,請求對象及響應對象将分别被此四個容器處理,請求響應對象在四個容器之間通過管道機制進行傳遞。如下圖,請求響應對象先通過StandardEngine的管道,期間經過若幹個閥門處理,基礎閥門是StandardEngineValve;往下流轉到StandardHost的管道,基礎閥門為StandardHostValve;類似地通過StandardContext;最後到StandardWrapper完成整個處理流程。

Tomcat的管道

這種設計為每個容器都帶來了靈活的機制,可以按照需要對不同容器添加自定義閥門進行不同的邏輯處理,并且tomcat将管道機制做成可配置形式,對于存在的閥門隻需通過配置檔案即可,還可以自定義閥門并配置就可在相應作用域内生效。四個容器中每個容器都包含自己的管道對象,管道對象用于存放若幹閥門對象,他們都有自己的基礎閥門,且基礎閥門是tomcat預設設定的,一般不可更改之,以免運作時産生問題。

下面分别看看這些基礎閥門詳細的解析

① StandardEngineValve,此閥門最重要的邏輯如下,調用時它會擷取請求對應的主機host對象,同時負責調用host對象中管道的第一個閥門。

public final voidinvoke(Request request, Response response)

        throws IOException, ServletException {

        Host host = request.getHost();

       host.getPipeline().getFirst().invoke(request, response);

    }

② StandardHostValve,盡管包含了其他的處理邏輯,但不可缺少的邏輯是擷取請求對應的上下文context對象并調用context對象中管道的第一個閥門。

        Context context = request.getContext();

觸發request初始化事件

        context.getPipeline().getFirst().invoke(request, response);

更新會話上次通路時間

③ StandardContextValve,上下文基礎閥門先會判斷是否通路了禁止目錄WEB-INF或META-INF,接着擷取請求對應的wrapper對象,再向用戶端發送通知封包“HTTP/1.1 100 Continue”,最後調用wrapper對象中管道的第一個閥門。

判斷通路路徑是否包含WEB-INF或META-INF,禁止通路此目錄

        Wrapper wrapper = request.getWrapper();

        向用戶端發送"HTTP/1.1 100 Continue"通知

       wrapper.getPipeline().getFirst().invoke(request, response);

④ StandardWrapperValve,包裝器基礎閥門負責統計請求次數、統計處理時間、配置設定Servlet記憶體、執行servlet過濾器、調用Servlet的service方法、釋放Servlet記憶體。

        統計請求次數

        StandardWrapper wrapper =(StandardWrapper) getContainer();

        Servlet servlet = wrapper.allocate();

        執行servlet的過濾器

        servlet.service(request, response);

        wrapper.deallocate(servlet);

        統計處理時間

<a target="_blank" href="https://item.jd.com/12185360.html">點選訂購作者《Tomcat核心設計剖析》</a>

繼續閱讀