- 1、本文档共16页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Tomcat 5源码分析
代码准备与DEBUG调试配置
官方下载地址: HYPERLINK "http://archive.apache.Org/dist/tomcat/tomcat-5/v5.0.28/src/"http://archive.apache.Org/dist/tomcat/tomcat-5/v5.0.28/src/
毕竟太老了(04年的东西),很多jar依赖祁下不下来了。建议使用我修正后的 source,下载后直接
根冃录ant即可完成build。为了方便跟踪与调试,bin冃录下新建一个debug,后 面加上:
set JAVA_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8787
即开启JDPA,全称Java
Platform Debugger Architecture (关丁JPDA,这里还有篇论文可以看)同时等待 DEBUGER连接后再继
续(如果你使用的是我提供的,直接运行debug.bat就可以了)。Eclipse里新建 Remote Debug,端口号
8787。这样就可以在Eclipse里调试Tomcat 5 了。
总体结构
从下至上:
server:代表着整个Catalina (Tomcat内核代号)系统,系统基础,启动入口, 全局资源,
下属serviceo注意这里的port是管理用的(比如shutdown什么的),不是ht(p监 听端口。
seivice:代表一种服务,比如HTTP服务、JMX、JPDA,其本质上就是一组
connector,
接收相应的请求后递交给上层container进彳亍处理。一*个server可以有多个service, {R一个 service
只对应一个containero
engine> host> context、wrapper: Tomcat 的容器思想,每个容器实现Container 接口,一
个容拥有自己的资源配置、装载与事件分发机制。在实际中,事件的分发一般通 过“观察者”模式,
而上层数据则通过pipeline (后再详说)。
(图3注:成员未全部列出)
容器与生命周期管理思想
容器是tomcat 5中的重耍思想。一个容器是负责处理加工来自外部的请求并将结 果返回的模块。所有的容
器都实现了Container这个接口,其采用了典型的Compositor模式。成员中其中较 重耍的是pipeline与
resourceo 一个请求是通过invoke方法到达的,Host、Wrapper> Context都继承 ContainerBasec 前者
依次被后者包含,Tomcat
5 对这儿个的默认实现均称为StandardXXX,如StandardEngine。 Invoke方法 在ContainerBase 中的实
现即简单的调用pipeline的invoke,如下:
通过执彳亍pipeline的valve,执彳亍相应的操作。上层数据的递交就是通过pipeline实 现的。容器还采用了
Observer模式来分发消息,每当容器发生图3所示事件时,都会通知listener0其 实不仅是容器,这种设
计思想还贯穿于整个设计中。
再来说说生命周期管理。在启动tomcat的时候,我们能从控制台上明显看出,启 动分两个步骤:init与start。
Tomcat模块生命周期管理都实现了Lifecycle这个接口,其定义了stail()与stop() 方法,不过奇怪的是init()
在lifecycle中却没有定义,但儿本上实现了lifecycle的类都有init()方法(所以我 觉得这个也应该算在
lifecycle里面的)。因此,当启动时,只耍递归的调用init()与stag方法,就可以 完成启动,注销时则递
归地调用stop()即可。与容器的事件设计思想相同,生命周期的每步也会触发事件 消息,只要订阅对应的
事件,就可以非常容易地知晓其某阶段的进展。非常方便、简洁!
HTTP (TCP)连接管理详细
HTTP使用的是TCP连接。TCP是网联层协议,是端到端的。Tomcat使用的是 最原始的Socket进行连
接监听,^[.ServerSocket.ServerSocket(int,int)。早些时候Tomcat 使用的是 一个线程监听,多个
工作线程的模式:即一个线程专门负责响应连接谙求,再递交给工作线程进行处 理。Tomcat
5后开始使用线程池取代了原有的方案。如下图所示:
早期的方式
新方式
那么单从结构來说,新的方式相对了老方法而言,消减了线程Z间不必须的关联 关系,使单个请求的处理
流程完全独立。同时我们看到,在老方式里,一旦listener线程挂掉,那么整个t
文档评论(0)