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