您的当前位置:首页正文

Tomcat源码分析(3)-容器Container整体架构

来源:九壹网
Tomcat源码分析(3)-容器Container整体架构

之前的博⽂介绍了tomcat有两⼤核⼼组件,connector和container,connector负责接受外部请求,container负责处理请求,本⽂从源码的⾓度介绍container的整体架构。

⼀、容器分类

tomcat容器为四个:

Engine:代表容器引擎,管理多个虚拟站点,⼀个Service只有⼀个EngineHost:代表虚拟主机

Context:代表⼀个web站点Wrapper:代表⼀个servlet

⼆、容器的结构

以上四⼤容器是⽗⼦关系,但是统⼀实现了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);}

实现了统⼀接⼝,所以整体使⽤组合模式来进⾏组装和运转。

三、容器Pipeline、Valve(容器的执⾏链)

在Container的接⼝定义中有个Pippeline,这个就是当前容器的执⾏链,当执⾏到这个容器时,实际是执⾏这个pipeline进⾏实际的操作。

Pipeline接⼝定义

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返回最后⼀个节点。

Valve定义

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。BasicValve会调⽤⼦容器的getFirst节点把请求传给⼦容器。

上⼀篇博⽂中代码可以看到adapter是调⽤Engine的getFirst把请求传递到容器的。

整体过程

其中有⼀点需要说明的是BasicValve⽤于是pipeline的最后⼀个Valve。代码做了保证(setBasic⽅法)。

因篇幅问题不能全部显示,请点此查看更多更全内容

Top