深入拆解Tomcat & Jetty
李号双
eBay技术主管
立即订阅
6067 人已学习
课程目录
已完结 44 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | Java程序员如何快速成长?
免费
模块一 必备基础 (4讲)
01 | Web容器学习路径
02 | HTTP协议必知必会
03 | 你应该知道的Servlet规范和Servlet容器
04 | 实战:纯手工打造和运行一个Servlet
模块二 整体架构 (9讲)
05 | Tomcat系统架构(上): 连接器是如何设计的?
06 | Tomcat系统架构(下):聊聊多层容器的设计
07 | Tomcat如何实现一键式启停?
08 | Tomcat的“高层们”都负责做什么?
09 | 比较:Jetty架构特点之Connector组件
10 | 比较:Jetty架构特点之Handler组件
11 | 总结:从Tomcat和Jetty中提炼组件化设计规范
12 | 实战:优化并提高Tomcat启动速度
13 | 热点问题答疑(1):如何学习源码?
模块三 连接器 (9讲)
14 | NioEndpoint组件:Tomcat如何实现非阻塞I/O?
15 | Nio2Endpoint组件:Tomcat如何实现异步I/O?
16 | AprEndpoint组件:Tomcat APR提高I/O性能的秘密
17 | Executor组件:Tomcat如何扩展Java线程池?
18 | 新特性:Tomcat如何支持WebSocket?
19 | 比较:Jetty的线程策略EatWhatYouKill
20 | 总结:Tomcat和Jetty中的对象池技术
21 | 总结:Tomcat和Jetty的高性能、高并发之道
22 | 热点问题答疑(2):内核如何阻塞与唤醒进程?
模块四 容器 (8讲)
23 | Host容器:Tomcat如何实现热部署和热加载?
24 | Context容器(上):Tomcat如何打破双亲委托机制?
25 | Context容器(中):Tomcat如何隔离Web应用?
26 | Context容器(下):Tomcat如何实现Servlet规范?
27 | 新特性:Tomcat如何支持异步Servlet?
28 | 新特性:Spring Boot如何使用内嵌式的Tomcat和Jetty?
29 | 比较:Jetty如何实现具有上下文信息的责任链?
30 | 热点问题答疑(3):Spring框架中的设计模式
模块五 通用组件 (4讲)
31 | Logger组件:Tomcat的日志框架及实战
32 | Manager组件:Tomcat的Session管理机制解析
33 | Cluster组件:Tomcat的集群通信原理
特别放送 | 如何持续保持对学习的兴趣?
模块六 性能优化 (8讲)
34 | JVM GC原理及调优的基本思路
35 | 如何监控Tomcat的性能?
36 | Tomcat I/O和线程池的并发调优
37 | Tomcat内存溢出的原因分析及调优
38 | Tomcat拒绝连接原因分析及网络优化
39 | Tomcat进程占用CPU过高怎么办?
40 | 谈谈Jetty性能调优的思路
41 | 热点问题答疑(4): Tomcat和Jetty有哪些不同?
结束语 (1讲)
结束语 | 静下心来,品味经典
深入拆解Tomcat & Jetty
登录|注册

29 | 比较:Jetty如何实现具有上下文信息的责任链?

李号双 2019-07-16
我们知道 Tomcat 和 Jetty 的核心功能是处理请求,并且请求的处理者不止一个,因此 Tomcat 和 Jetty 都实现了责任链模式,其中 Tomcat 是通过 Pipeline-Valve 来实现的,而 Jetty 是通过 HandlerWrapper 来实现的。HandlerWrapper 中保存了下一个 Handler 的引用,将各 Handler 组成一个链表,像下面这样:
WebAppContext -> SessionHandler -> SecurityHandler -> ServletHandler
这样链中的 Handler 从头到尾能被依次调用,除此之外,Jetty 还实现了“回溯”的链式调用,那就是从头到尾依次链式调用 Handler 的方法 A,完成后再回到头节点,再进行一次链式调用,只不过这一次调用另一个方法 B。你可能会问,一次链式调用不就够了吗,为什么还要回过头再调一次呢?这是因为一次请求到达时,Jetty 需要先调用各 Handler 的初始化方法,之后再调用各 Handler 的请求处理方法,并且初始化必须在请求处理之前完成。
而 Jetty 是通过 ScopedHandler 来做到这一点的,那 ScopedHandler 跟 HandlerWrapper 有什么关系呢?ScopedHandler 是 HandlerWrapper 的子类,我们还是通过一张图来回顾一下各种 Handler 的继承关系:
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《深入拆解Tomcat & Jetty 》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(5)

  • neohope
    最后的问题,应该是这样的:

    protected void doStart() throws Exception
    {
        try{
            _outerScope=__outerScope.get();
            if (_outerScope==null){
               //本次处理的第一个scope handler
               //告知后续scope handler,_outerScope选我
                __outerScope.set(this);
            }
            super.doStart();
            _nextScope= getChildHandlerByClass(ScopedHandler.class);
        }
        finally
        {
            if (_outerScope==null){
               //本次处理结束
               //为了下次同一个线程处理是,
               //还能正常的设置第一个scope handler
               //必须把threadlocal变量设为null
                __outerScope.set(null);
            }
        }
    }


    此外,这一节里有一个non scoped handler X,一开始没太看懂调阅顺序。
    后来发现是这样的:

    public final void nextHandle(String target...)...
    {
        if (_nextScope!=null && _nextScope==_handler){
            //上面条件可以保证下一个handler是scope handler
            _nextScope.doHandle(target,baseRequest,request, response);
        }
        else if (_handler!=null){
            //non scpoe handler调用下一个handler的
            super.handle(target,baseRequest,request,response);
        }
    }

    感觉类成员的命名不太合适,
    比如__outerScope和_outerScope
    比如_handler其实一直指向的是下一个handler,是不是该为_nextHandler更好一些?

    作者回复: 给你的钻研精神点赞👍

    2019-07-23
    3
  • despacito
    ScopedHandler 会有不同的实现类,而__outerScope 是ScopedHandler里static的变量,如果不设置为null,那么不同的子类实例执行doStrat()方法的时候,会有问题
    2019-07-16
    2
  • 往事随风,顺其自然
    可以重新处理下一次请求
    2019-07-16
    2
  • nightmare
    每一次请求的请求链互不影响
    2019-07-16
    2
  • 帽子丨影
    感觉jetty的源码写的好混乱,经常没有注释,一个类也通常扩展3/4个接口功能,还各种循环嵌套。好难懂。。。
    2019-09-26
    1
收起评论
5
返回
顶部