Tomcat的管道和阀
来源:互联网 发布:java ssl 双向认证 编辑:程序博客网 时间:2024/04/28 16:50
引言
最近在学习tomcat的实现机制,其中提到了tomcat的是通过管道和阀的机制来对各个servlet进行加载的,但是书上说的太晦涩,对我这种新手来说显得很难懂,所以自己另外找了些资料,补充并写了些自己的一些理解。
管道
Tomcat中按照包含关系一共有四个容器——engine,host,context,wrapper;请求对象和响应对象会分别被这四个容器处理,请求响应对象在四个容器之间通过管道机制进行传递。请求响应首先经过engine的管道,期间经过若干个阀门的处理,基础阀门是engineValue,向下流转到host管道,基础阀为hostValue,类似通过context直到通过wrapper完成整个处理流程。
为什么要有这种阀门的机制?因为这样的设计可以针对不同的容器添加不同的阀门(处理逻辑),同时,tomcat将管道机制做成可以通过配置文件进行配置的方式,使得阀门可以自定义。四个容器中每个容器都包含自己的管道对象,管道对象用来存放若干阀门对象,但tomcat会为他们制定一个默认的基础阀门。
阀门
- StandardEngineValue
此阀门在调用时会获取请求主机的host对象,同时负责调用host对象管道中的第一个阀门。
public final void invoke(Request request,Response response) throws IOException, ServletException{ Host host = request.getHost(); host.getPipeline().getFirst().incoke(request,response);}
StandardHostValue,其中最重要的逻辑是获取请求对应的上下文的context对象并调用context对象中管道的第一个阀门。
//触发request初始化事件
Context context = request.getContext();
//更新上次会话的访问时间
context.getPipeline().getFirst().invoke(request,response);
}StandardContextValue,上下文的基础阀门会判断是否访问了禁止目录WEB-INF或者META-INF,接着获取请求对应的wrapper对象,在向着客户端发送通知报文“HTTP/1/1 100 Continue”,最后调用wrapper对象中管道的第一个阀门。
public final void invoke(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);}
- StandardWrapperValue,包装器基础阀门负责请求次数、处理统计时间、分配Servlet内存,执行servlet过滤器,调用servlet的service方法,释放servlet内存。
public final void invoke(Request request,Response response) throws IOExcption,ServletException{ //统计请求次数 StandardWrapper wrapper = (StandardWrapper) getContainer(); Servlet servlet = wrapper.allocate(); //执行servlet过滤器 servlet.service(request,response); wrapper.deallocate(servlet); //统计处理时间}
- Tomcat的管道和阀
- Tomcat的管道
- linux的管道和命名管道
- linux的管道和命名管道
- 有名管道和无名管道的区别
- linux的管道和命名管道
- 有名管道和无名管道的区别
- 有名管道和无名管道的区别
- 提桶和管道的故事
- fork和管道的关系
- xargs和管道的区别
- 管道和socket的区别
- 管道和命名管道
- 管道和有名管道
- Linux系统管道和有名管道的通信机制
- 无名管道和有名管道的概念与实现
- 管道的故事(二)提桶者和管道创建者
- Linux下的管道pipe----管道容量和实现机制
- 简易新闻客户端(生成列表)
- 位运算【C++学习(计蒜客)】
- hdu 2089 -不要62(数位 dp)
- Single Number III
- Android 自定义ViewGroup 实战篇 -> 实现FlowLayout
- Tomcat的管道和阀
- ubuntu下vi编辑器的使用
- CSS中的line-height百分比
- .net三个小工具(dapper+postsharp+nuget)
- javaScript事件类型四(键盘与文本事件)
- 排序-归并排序
- 如何在MyEclipse中使用MyBatis将MySQL数据表生成相应的实体类和映射文件
- java设计模式
- Java - Java books