time 
设为首页】【收藏本站
当前位置: 主页 > JAVA > 开发工具 > Tomcat > Tomcat容器结构及Pipeline机制分析

Tomcat容器结构及Pipeline机制分析

时间:2013-06-30 21:53 点击:1722次 字体:[ ]




  直接学习tomcat的valve好像有点突兀,所以还是先去了解下tomcat的一个核心的组件container
container从上一个组件connector手上接过解析好的内部request,根据request来进行一系列的逻辑操作,直到调用到请求的servlet,然后组装好response,返回给clint。
  整个大流程还是清晰明了的。毕竟我们大概了解了tomcat的输入和输出也能猜出它里面的一些必要的操作。

先来看看container的分类吧:
Engine
Host
Context
Wrapper
它们各自的实现类分别是StandardEngine, StandardHost, StandardContext, and StandardWrapper,他们都在tomcat的org.apache.catalina.core包下。

它们之间的关系,可以查看tomcat的server.xml也能明白(根据节点父子关系),这么比喻吧:除了Wrapper最小,不能包含其他container外,Context内可以有零或多个Wrapper,Host可以拥有零或多个Host,Engine可以有零到多个Host。

在tomcat6里这些Standard 的 container都是直接继承抽象类:org.apache.catalina.core.ContainerBase:

Tomcat容器结构及Pipeline机制分析_www.fengfly.com

 

ContainerBase这个类中的一些方法名我们可以看到各个container之间包含和被包含的操作是如何实现的,这些都是他提供的方法:

  1. public void addChild(Container child)  
  2. public Container findChild(String name)  
  3. public Container[] findChildren()  
  4. public ObjectName[] getChildren()  
  5. public Container getParent()  
  6. public ObjectName getParentName()  
  7. public void removeChild(Container child) 

当然一个container的实现是复杂的,先跳过,未来定有机会回来学习的。

Pipeline的机制:

它的结构和实现是非常值得我们学习和借鉴的。

来看看来自网络的流程图(很不错的图):

Tomcat容器结构及Pipeline机制分析_www.fengfly.com

多好的图啊,单看图你就可以了解大概的tomcat运行的情况了,哈哈。

首先要了解的是每一种container都有一个自己的StandardValve
上面四个container对应的四个是:
StandardEngineValve
StandardContextValve
StandardHostValve
StandardWrapperValve

有人把vavle比作filter,而Pipeline比作filter chain,其实已经很恰当了。这里就说下我的理解:

开端:
在CoyoteAdapter的service方法里,由下面这一句就进入Container的。
connector.getContainer().getPipeline().getFirst().invoke(request, response);  
是的,这就是进入container迷宫的大门,欢迎来到Container。

Pipeline(注意上面结构图的pipeline的连线):

Pipeline就像一个工厂中的生产线,负责调配工人(valve)的位置,valve则是生产线上负责不同操作的工人。
一个生产线的完成需要两步:
1,把原料运到工人边上
2,工人完成自己负责的部分

而tomcat的Pipeline实现是这样的:
1,在生产线上的第一个工人拿到生产原料后,二话不说就人给下一个工人,下一个工人模仿第一个工人那样扔给下一个工人,直到最后一个工人,而最后一个工人被安排为上面提过的StandardValve,他要完成的工作居然是把生产资料运给自己包含的container的Pipeline上去。
2,四个container就相当于有四个生产线(Pipeline),四个Pipeline都这么干,直到最后的StandardWrapperValve拿到资源开始调用servlet。完成后返回来,一步一步的valve按照刚才丢生产原料是的顺序的倒序一次执行。如此才完成了tomcat的Pipeline的机制。

结束:

所有的vavle执行完毕后,整个响应的也就结束了。


关于Pipeline我们来看下源码:

一个StandardValve

来自org.apache.catalina.core.StandardEngineValve的invoke方法:

  1. public final void invoke(Request request, Response response)  
  2.         throws IOException, ServletException {  
  3.  
  4.         // 拿到自己包含的host  
  5.         Host host = request.getHost();  
  6.         if (host == null) {  
  7.             response.sendError  
  8.                 (HttpServletResponse.SC_BAD_REQUEST,  
  9.                  sm.getString("standardEngine.noHost",   
  10.                               request.getServerName()));  
  11.             return;  
  12.         }  
  13.  
  14.         // 最为自己pipeline上最后一位工人,负责把原料运给系一个pipeline  
  15.         // 这是把所有pipeline串联起来的关键  
  16.         host.getPipeline().getFirst().invoke(request, response);  
  17.     }  


本文地址 : http://www.fengfly.com/plus/view-213003-1.html
标签: Tomcat 机制 容器结构 Pipeline
------分隔线----------------------------
最新评论 查看所有评论
发表评论 查看所有评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
验证码: