Tomcat阅读笔记

通读Tomcat之后留下一点点东西,谈不上分析,只是自己学习的一个笔记,重要与否因人而异,以下都是我认为比较重要并且适合自己学习的。

1、Tomcat的生命周期和启动过程
tomcat是组件化开发的典范,组件的构成可以查看conf下的server.xml。tomcat所有的组件都继承了Lifecycle接口,服务的启动从上层的组件开始init、start,再init、start当前组件的下一层,后面的组件以此如此,所以它的生命周期是由最上层的Server服务(容器)决定的。


2、Http11Protocol——>Acceptor线程对象——>处理线程Work对象
Acceptor只是单纯的负责监听来自Socket端口的TCP/IP请求,然后把复杂的处理逻辑委托给Worker去处理,接着去接收下一个请求,有点类似于接收器模式与传统的接收器模式不同的是Worker不是由工厂产生的。


3、ActionHook   
组件或者对象的状态较多,并且状态切换时有一些共通的业务处理逻辑,适合引入ActionHook模式,类似于触发器的钩子,这类设计方法在wordpress和jvm中都有使用。


4、Connector——>CoyoteAdapter——>protocolHandler
连接器,协议处理器,处理器适配器。tomcat5的时候连接器到协议处理器还没有使用适配器模式,而是根据不同的协议初始化不同的协议处理器来处理不同协议的请求。这样显然不利于组件的扩展,当我需要增加一个协议支持的时候,还需要去修改Service加载Connector部分的代码。使用适配器模式,就不需要这样做了,对于新扩展的连接器只需要把协议类定义在server.xml的connector中即可。


5、tomcat.comet.support
以前在做实时通讯的时候,采用的是xmpp协议,客户端和服务端使用心跳保持连接,保证交互的实时性。而对于web应用而言xmapp协议显然不合适,之前有了解过除了保持长连接(服务器扛不住)还有一些轻量型的框架可以实现服务端向web端的推送,其实我们的Tomcat也有对Comet的支持,这也是最近几天阅读tomcat源码才了解的。详细了解移步:https://www.ibm.com/developerworks/cn/web/wa-cometjava/。


6、LifecycleListener
整个证明周期所有事件的触发,都依赖于LifecycleListener,伴随着组件或者容器的init、start、addChild、destroy等操作,这个过程中会根据适当的场景执行相应的addLifecycleListener操作,所有的容器都会有一个XxxConfig类实现LifecycleListener接口来充当LifecycleListener的角色。在init、start等过程中也会调用fireLifecycleEvent,进而促发组件里所有Listener对应类型(过程:INITIALIZED、STARTING_PREP、STARTING)的事件。通过这样巧妙设计,既保证了所有组件生命周期的统一,又把容器的生命周期活动(事件)的具体实现分离了出来。


7、Digester
Digester对于xml的解析没有什么值得一说的,但他有一个优于Xerces,dom4j等特性,他可以很方便的根据xml生成java对象,还可以根据匹配模式(matching pattern)识别,再由规则(rule)执行定义的操作,这一点异常强大,在构建组件化的应用时非常有用,Tomcat中就是用Digester解析Web.xml来配置Context以及下面filter、servlet、listener等等。

8、DeltaManager

Tomcat本身提供了集群的方法,只需要在Server.xml或者Context.xml中配置DeltaManager的SessionManager即可,这里我想说的是它的具体实现,利用IP组播的方式向其他节点发送Session数据,从而达到Session复制的功能。(扩展阅读:IP组播与组播协议

9、StandardManager,PersistentManager

对于Session的管理tomcat提供了两种manager,StandardManager配置比较少,主要差别在于持久化的配置,StandardManager在tomcat启动的时候会执行load方法加载SESSIONS.ser中的session数据,在tomcat关闭的时候会支持unload,把session写到SESSIONS.ser中(原来我一直以为持久化是在createSession的时候做的)。

猜你喜欢

转载自dagmom.iteye.com/blog/2007865