tomcat架构分析(valve机制)【转】
原文地址:https://www.iteye.com/blog/gearever-1536022
关于tomcat的内部逻辑单元的存储空间已经在相关容器类的blog里阐述了。在每个容器对象里面都有一个pipeline及valve模块。它们是容器类必须具有的模块。在容器对象生成时自动产生。Pipeline就像是每个容器的逻辑总线。在pipeline上按照配置的顺序,加载各个valve。通过pipeline完成各个valve之间的调用,各个valve实现具体的应用逻辑。
先看一下pipeline及valve的逻辑概念图。
这些valve就是在tomcat的server.xml中配置,只要满足一定条件,继承ValveBase基类
就可以在不同的容器中配置,然后在消息流中被逐一调用。每个容器的valve的作用域不一样,在总体结构中已有说明。这里红色标记的是配置的自定义的valve,这样可以扩展成多个其他应用,例如cluster应用等。
Tomcat实现
Tomcat提供了Pipeline的标准实现:
四大容器类StandardEngine,StandardHost,StandardContext及StandardWrapper都有各自缺省的标准valve实现。它们分别是
- Engine:org.apache.catalina.core.StandardEngineValve
- Host: org.apache.catalina.core.StandardHostValve
- Context:org.apache.catalina.core.StandardContextValve
- Wrapper:org.apache.catalina.core.StandardWrapperValve
容器类生成对象时,都会生成一个pipeline对象,同时,生成一个缺省的valve实现,并将这个标准的valve对象绑定在其pipeline对象上。以StandardHost类为例:
- public class StandardHost extends ContainerBase implements Host {
- protected Pipeline pipeline = new StandardPipeline(this);
- public StandardHost() {
- super();
- pipeline.setBasic(new StandardHostValve());
- }
- }
Valve实现了具体业务逻辑单元。可以定制化valve(实现特定接口),然后配置在server.xml里。每层容器都可以配置相应的valve,当只在其作用域内有效。例如engine容器里的valve只对其包含的所有host里的应用有效。定制化的valve是可选的,但是每个容器有一个缺省的valve,例如engine的StandardEngineValve,是在StandardEngine里自带的,它主要实现了对其子host对象的StandardHostValve的调用,以此类推。
配置的例子有:
- <Engine name="Catalina" defaultHost="localhost">
- <Valve className="MyValve0"/>
- <Valve className="MyValve1"/>
- <Valve className="MyValve2"/>
- ……
- <Host name="localhost" appBase="webapps">
- </Host>
- </Engine>
当在server.xml文件中配置了一个定制化valve时,会调用pipeline对象的addValve方法,将valve以链表方式组织起来,看一下代码;
- public class StandardPipeline implements Pipeline, Contained, Lifecycle{
- protected Valve first = null;
- public void addValve(Valve valve) {
- // Validate that we can add this Valve
- if (valve instanceof Contained)
- ((Contained) valve).setContainer(this.container);
- // Start the new component if necessary
- if (started) {
- if (valve instanceof Lifecycle) {
- try {
- ((Lifecycle) valve).start();
- } catch (LifecycleException e) {
- log.error("StandardPipeline.addValve: start: ", e);
- }
- }
- // Register the newly added valve
- registerValve(valve);
- }
- // 将配置的valve添加到链表中,并且每个容器的标准valve在链表的尾端
- if (first == null) {
- first = valve;
- valve.setNext(basic);
- } else {
- Valve current = first;
- while (current != null) {
- if (current.getNext() == basic) {
- current.setNext(valve);
- valve.setNext(basic);
- break;
- }
- current = current.getNext();
- }
- }
- }
- }
从上面可以清楚的看出,valve按照容器作用域的配置顺序来组织valve,每个valve都设置了指向下一个valve的next引用。同时,每个容器缺省的标准valve都存在于valve链表尾端,这就意味着,在每个pipeline中,缺省的标准valve都是按顺序,最后被调用。
消息流
先看一下四大容器的标准valve的调用逻辑图。从中可以梳理出标准valve的逻辑。注意此图只是在缺省配置下的状态,也就是说每个pipeline只包含一个标准valve的情况。
图中显示的是各个容器默认的valve之间的实际调用情况。从StandardEngineValve开始,一直到StandardWrapperValve,完成整个消息处理过程。注意每一个上层的valve都是在调用下一层的valve返回后再返回的,这样每个上层valve不仅具有request对象,同时还能拿到response对象,想象一下,这样是不是可以批量的做很多东西?
转载于:https://www.cnblogs.com/davidwang456/articles/11452722.html
tomcat架构分析(valve机制)【转】相关推荐
- tomcat架构分析(valve机制)
出处:http://gearever.iteye.com 关于tomcat的内部逻辑单元的存储空间已经在相关容器类的blog里阐述了.在每个容器对象里面都有一个pipeline及valve模块.它们是 ...
- tomcat架构分析(valve源码导读)【转】
原文地址:https://www.iteye.com/blog/gearever-1540028 源码面前,了无秘密 ----侯捷 在to ...
- tomcat架构分析(connector BIO 实现)【转】
原文地址:https://www.iteye.com/blog/gearever-1841586 在tomcat架构分析(概览)中已经介绍过,connector组件是service容器中的一部分.它主 ...
- tomcat架构分析 (Session管理)【转】
原文地址:https://www.iteye.com/blog/gearever-1546423 Session管理是JavaEE容器比较重要的一部分,在app中也经常会用到.在开发app时,我们只是 ...
- tomcat架构分析(概览)【转】
原文地址: https://www.iteye.com/blog/gearever-1532822 Tomcat是目前应用比较多的servlet容器.关于tomcat本身的特点及介绍,网上已经有很多描 ...
- tomcat架构分析(容器类)【转】
原文地址:https://www.iteye.com/blog/gearever-1533678 Tomcat提供了engine,host,context及wrapper四种容器.在总体结构中已经阐述 ...
- tomcat架构分析(容器类)
Tomcat提供了engine,host,context及wrapper四种容器.在总体结构中已经阐述了他们之间的包含关系.这四种容器继承了一个容器基类,因此可以定制化.当然,tomcat也提供了标准 ...
- tomcat架构分析 (connector NIO 实现)【转】
原文地址:https://www.iteye.com/blog/gearever-1844203 ller线程中维护的这个Selector标为主Selector. Poller是NIO实现的主要线程 ...
- 应用服务器——tomcat架构分析
先mark,后续补充 https://blog.csdn.net/qq_38245537/article/details/79009448
最新文章
- 关于css中float的一切
- 参加UI培训后可以找什么工作
- 无需用户输入,Adobe提出自动生成高质量合成图像新方法
- numpy.sum详解
- Apache Kafka-初体验Kafka(03)-Centos7下搭建kafka集群
- Nginx负载均衡状态之backup
- String,char,数组,列表 相互转化 (更新中)
- 使用 cert-manager 签发免费证书
- Python 模块之科学计算 Pandas
- php的控制器,php-模块与控制器
- java loadclass_【java 类加载的深入研究1】loadClass()的研究
- js验证手机号码,邮箱,qq号
- 使用JDBC处理Oracle大数据
- JNI介绍及简单实例
- 机器学习、AI那么火,千万小心别掉进前人的坑
- 简单函数编写_strcpy、_stroverchg、_strcmp
- 最新JMeter面试题,紧扣面试实际要求,看完拿下20K
- 最新第一波:全国信息化工程师软考-系统集成项目管理工程师(高级案例高分论文)
- 小象学院——面向对象的特点
- python扩展库用于科学计算的有哪些_数据科学必备的十大 Python 库
热门文章
- 《组织行为学》_09 彩虹理论:人力资本越来越高怎么办?
- 51单片机c语言数字输入输出,第五章 51单片机C语言程序--输入输出接口.pdf
- 如何选购晨检机器人_扫地机器人好不好用?如何选购?答案在这
- 主页被挟持 火狐浏览器_看过来!关于IE、360浏览器访问学校部分网站的设置说明在这里...
- tp5上传文件并获取文件路径_thinkphp表单上传文件并将文件路径保存到数据库中...
- 九江学院计算机主任黄冬久,陈春生副校长到实验中间调研引导工作
- mysql pool not open_安装 MariaDb 时报错:Could not open mysql.plugin table
- string类有可以调换方向的函数吗_C++中的string类的用法小结
- tcp c++ bind 端口_计算机端口到底是什么?
- Qt工程pro文件配置详解