以前的博文介紹了tomcat有兩大核心組件,connector和container,connector負責接受外部請求,container負責處理請求,本文從源碼的角度介紹container的總體架構。web
tomcat容器爲四個:tomcat
以上四大容器是父子關係,可是統一實現了Container接口:架構
public interface Container extends Lifecycle {
public Pipeline getPipeline(); public Container getParent(); public void setParent(Container container); public void backgroundProcess(); public void addChild(Container child); public Container findChild(String name); public Container[] findChildren(); public void removeChild(Container child); }
實現了統一接口,因此總體使用組合模式來進行組裝和運轉。app
在Container的接口定義中有個Pippeline,這個就是當前容器的執行鏈,當執行到這個容器時,實際是執行這個pipeline進行實際的操做。spa
public interface Pipeline { public Valve getBasic(); public void setBasic(Valve valve); public void addValve(Valve valve); public Valve[] getValves(); public void removeValve(Valve valve); public Valve getFirst(); public boolean isAsyncSupported(); public Container getContainer(); public void setContainer(Container container); }
Pipeline猶如一個鏈表,valve是其中的每個節點(也是具體的執行單元),其中getFirst返回第一個節點,getBasic返回最後一個節點。code
public interface Valve { public Valve getNext(); public void setNext(Valve valve); public void backgroundProcess(); public void invoke(Request request, Response response) throws IOException, ServletException; }
每個Valve執行完畢後會調用getNext把請求傳給下一個Valve。blog
BasicValve會調用子容器的getFirst節點把請求傳給子容器。接口
上一篇博文中代碼能夠看到adapter是調用Engine的getFirst把請求傳遞到容器的。ip
其中有一點須要說明的是BasicValve用因而pipeline的最後一個Valve。代碼作了保證(setBasic方法)。rem