您的位置:首页 > 运维架构 > Tomcat

探索《How Tomcat Works》心得(二)

2016-05-12 00:13 477 查看
这次主要谈谈第四章 the default connector,tomcat默认的连接器我按照书中讲解的那样,分为三个部分谈谈我对Tomcat默认连接器的理解。

一、一次链接持久的处理多次请求。这里涉及到两个重要的人物,HttpConnector和HttpProcessor,在书中前面的内容中,已经清楚,HttpConnector的作用时创建连接,把客户端传递过来的socket交给HttpProcessor处理。HttpProcessor做的事情是解析socket中的信息,创建Request和Response对象并装载器内容,并将这两个对象交给容器中的servlet。那么第四章的默认的连接器的这两个对象所做的事情与我上面所累述的内容的不同点在于,这里的HtttConnector已经不是当初的HttpConnector了,他现在拥有一个存储HttpPorcessor的Stock,在HttpConnector初始化的时候,就会创建多个HttpProcessor对象,并将它们放到stock中,一个HttpProcessor能够处理一个连接,一个HttpConnector拥有多个HttpProcessor,那就意味着这里的HttpConnector能够处理多个连接。要让HttpConnector能够处理多个连接,光做哪些事情恐怕是不够的,因为按照之前的讲的,HttpConnector在将获得到的socket传递给HttpProcessor之后,只有当HttpProcessor处理完socket之后,HttpConnector才可以练下一个连接。为了解决这个问题。实现HttpConnector与HttpProcessor的异步处理,就引出了下面我要讲的设计模式了。为了实现异步,在HttpProcessor设计了两个重要的方法assign和await;看着名字不难联想到,assign是给connector用的,await是给processor自己使用的。在这里,HttpProcessor有自己独立的线程,当HttpConnector吧它创建出来之后,会启动HttpProcessor的线程。在HttpProcessor的run方法中,为了一个processor能够keep-alive的处理请求,使用了while循环进行读取请求的操作。当然,它呗启动之后,一直在while循环中的await方法中的wait,它在等待connector传递socket的通知。当connector接收到socket之后,它会调用processor的assign方法,这个方法中又一个notifyAll,唤醒等待中的线程。并把获得的socket复制给processor,到这里connector就光荣完成任务了,接下来他要做的就是等待下一个连接了。processor接到通知后就开始忙自己的事情做下面的事了,解析连接,解析请求,解析头部,等等。我在这里是说明下思路,如果想要真正的了解,需要看默认连接器的源码的。

二、说说httpprocessor中的run方法。这里的run 方法的精彩的地方在于,它需要使用一个socket解析多个请求。这个要求解析完当次的socket之后,不能将socket关闭,而是要等着,等着socket中前来的下一个请求信息。while上的三个控制条件:Ok、keepAlive、stop,这三个因素决定了是否关闭连接。另外还有一点信息需要指出,Http1.0不支持持续连接,所以这里需要解析Http协议,并且如果是1.0,则while中要过掉的。

三、简单的容器。没有仔细的研究简单的容器这个东西。容积主要是connector获取到,并且加载servlet的class,把request和response传递给Serlet的service方法。关于容器的相关知识,自己会随着学习的深入加深了解。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: