Tomcat的管道

Tomcat中按照包含关系一共有四个容器——StandardEngine、StandardHost、StandardContext和StandardWrapper,对这四个容器的详细解析后面会涉及,请求对象及响应对象将分别被此四个容器处理,请求响应对象在四个容器之间通过管道机制进行传递。如下图,请求响应对象先通过StandardEngine的管道,期间经过若干个阀门处理,基础阀门是StandardEngineValve;往下流转到StandardHost的管道,基础阀门为StandardHostValve;类似地通过StandardContext;最后到StandardWrapper完成整个处理流程。

这种设计为每个容器都带来了灵活的机制,可以按照需要对不同容器添加自定义阀门进行不同的逻辑处理,并且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对象中管道的第一个阀门。

public final voidinvoke(Request request, Response response)

throws IOException, ServletException {

Context context = request.getContext();

触发request初始化事件

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

更新会话上次访问时间

}

③ StandardContextValve,上下文基础阀门先会判断是否访问了禁止目录WEB-INF或META-INF,接着获取请求对应的wrapper对象,再向客户端发送通知报文“HTTP/1.1 100 Continue”,最后调用wrapper对象中管道的第一个阀门。

public final voidinvoke(Request request, Response response)

throws IOException, ServletException {

判断访问路径是否包含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内存。

public final voidinvoke(Request request, Response response)

throws IOException, ServletException {

统计请求次数

StandardWrapper wrapper =(StandardWrapper) getContainer();

Servlet servlet = wrapper.allocate();

执行servlet的过滤器

servlet.service(request, response);

wrapper.deallocate(servlet);

统计处理时间

}

时间: 2024-08-27 23:50:05

Tomcat的管道的相关文章

Tomcat中管道

处理模式 Pipeline--Valve是一种责任链模式,它和普通责任链模式有两点区别: 每个Pipeline都是有特定的Valve,而且是在管道的最后一个执行,这个Valve叫BaseValve,并且BaseValve是不可删除的: 在上层容器的管道的BaseValve中会调用下层容器的管道. Tomcat中的管道 ? Tomcat按照包含关系有4个级别的容器,标准实现分别是: StandardEngine StandardHost StandardContext StandardWrappe

75篇关于Tomcat源码和机制的文章

75篇关于Tomcat源码和机制的文章 标签: tomcat源码机制 2016-12-30 16:00 10083人阅读 评论(1) 收藏 举报  分类: tomcat内核(82)  版权声明:本文为博主原创文章,未经博主允许不得转载. 整理下前面写过的75篇关于Tomcat源码和机制的文章 文章列表 如何设计一个Web容器 Web安全认证机制知多少 Tomcat集群实现源码级别剖析 Tomcat集群如何同步会话 从单机到集群会话的管理之集群模式一 从单机到集群会话的管理之集群模式二(更大的集群

Tomcat源码分析——请求原理分析(下)

前言 本文继续讲解TOMCAT的请求原理分析,建议朋友们阅读本文时首先阅读过<TOMCAT源码分析——请求原理分析(上)>和<TOMCAT源码分析——请求原理分析(中)>.在<TOMCAT源码分析——请求原理分析(中)>一文我简单讲到了Pipeline,但并未完全展开,本文将从Pipeline开始讲解请求原理的剩余内容. 管道 在Tomcat中管道Pipeline是一个接口,定义了使得一组阀门Valve按照顺序执行的规范,Pipeline中定义的接口如下: getBas

linux系列之常用运维命令

一.系统监控 1.free命令 free 命令能够显示系统中物理上的空闲和已用内存,还有交换内存,同时,也能显示被内核使用的缓冲和缓存 语法:free [param] param可以为: -b:以Byte为单位显示内存使用情况: -k:以KB为单位显示内存使用情况: -m:以MB为单位显示内存使用情况: -o:不显示缓冲区调节列: -s<间隔秒数>:持续观察内存使用状况: -t:显示内存总和列: -V:显示版本信息. Mem:表示物理内存统计 total:表示物理内存总数(total=used

linux运维命令

本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 文章目录 一.系统监控 1.free命令 2.ulimit命令 3.top命令 4.df命令 5.ps命令 二.文件操作 1.tail命令 2.ll -ah 三.网络通信 1.netstat 2.重启网络 3.SELinux 4.防火墙 四.系统管理 1.u

tomcat系列之整体结构

本系列文章是基于tomcat6.0的源码. 首先分析一下tomcat的启动脚本,windows下的bat, if "%OS%" == "Windows_NT" setlocal rem --------------------------------------------------------------------------- rem Start script for the CATALINA Server rem ---------------------

TOMCAT源码分析(启动框架)

建议: 毕竟TOMCAT的框架还是比较复杂的, 单是从文字上理解, 是不那么容易掌握TOMCAT的框架的. 所以得实践.实践.再实践. 建议下载一份TOMCAT的源码, 调试通过, 然后单步跟踪其启动过程. 如果有不明白的地方, 再来查阅本文, 看是否能得到帮助. 我相信这样效果以及学习速度都会好很多! 1. Tomcat的整体框架结构 Tomcat的基本框架, 分为4个层次. Top Level Elements: Server Service Connector HTTP AJP Conta

【转】Tomcat调优指南

转载地址:http://blog.csdn.net/woohooli/article/details/3954792 1          概述 本文档主要介绍了Tomcat的性能调优的原理和方法.可作为公司技术人员为客户Tomcat系统调优的技术指南,也可以提供给客户的技术人员作为他们性能调优的指导手册. 2          调优分类 由于Tomcat的运行依赖于JVM,从虚拟机的角度我们把Tomcat的调整分为外部环境调优和自身调优两类来描述. 2.1      外部环境调优 调整Tomc

Tomcat怎么实现异步Servlet

有时Servlet在生成响应报文前必须等待某些耗时的操作,比如在等待一个可用的JDBC连接或等待一个远程Web服务的响应.对于这种情况servlet规范中定义了异步处理方式,由于Servlet中等待阻塞会导致Web容器整体的处理能力低下,所以对于比较耗时的操作可以放置到另外一个线程中进行处理,此过程保留连接的请求和响应对象,在处理完成之后可以把处理的结果通知到客户端. 下面先看Servlet在同步情况下的处理过程,如图所示,Tomcat的客户端请求由管道处理最后会通过Wrapper容器的管道,这