以前的博文介绍了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