- 浏览: 20065 次
- 性别:
- 来自: 杭州
最新评论
文章列表
Tomcat中Session的实现还是比较清晰的,先看类图:
其中HttpSession是Servlet Api,从类图看出来,这里使用了facade模式,StandardSessionFacade为一个门面,而 HttpSession的真正的实现类为StandardSession,它还实现了一个在tomcat内部使用的Session接口,这里讲的都是单台Tomcat的Session,tomcat集群是另外一套的代码。
Manager接口的实现是Session的管理者,保存着这台tomcat中所有的Session.Manager在Context启动的时候被创建,被 ...
上文http://nod0620.iteye.com/admin/blogs/1030398
写了session复制的发送部分,继续接收部分:
当接收方tomcat接收到需要session的消息时,最终调用了GroupChannel的messageReceived()方法
public void messageReceived(ChannelMessage msg) {
if ( msg == null ) return;
try {
if ( Logs.MESSAGES.isTraceEnabled() ...
tomcat的session复制大致分两种:all-to-all和backup,先看all-to-all,主要是记录下自己读源代码的心得和代码流程
tomcat集群配置暂时略过。
在tomcat的启动过程中,找到seesion复制的入口,在StandardContext的start()方法中:
Manager contextManager = null;
if (manager == null) {
if ( (getCluster() != null) & ...
上次说了NioReceiver,这次看看NioSender,NioSender的体系结构比较复杂的,但感觉不用这么复杂,先看下类图:
这里觉得ParallelNioSender和PooledParallelSender之间有一个类可以去掉,如去了PooledParallelSender,PooledSender类设计成接口,这样的话会比较简洁.
ChannelCoordinator使用的是PooledParallelSender,最后面最重要的是还是NioSender。
NioSender是个状态机,看注释:
* - NOT_CONNECT ...
tomcat集群的时候,在心跳通讯的时候,默认的接收器是NioReceiver,对NIO的使用是个比较经典的例子,在分析NIO之前,先看自己的一个NIO的小例子,代码:
public class HelloServer {
private Selector selector;
private ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
private String name;
public HelloServer() throws IOException {
selector = Select ...
上文说到在JIoEndpoint类中处理请求最终是调用到内部接口Handler的process()方法,而Handler的实现类是Http11Protocol的内部类Http11ConnectionHandler,Http11ConnectionHandler又委托Http11Processor进行处理,tomcat在这个地方我觉得类的设计不是很优雅啊,内部类用的太多,导致阅读的时候有困难(好处是内部类持有外部类的的引用,不用使用显示的new)。
先把Http11ConnectionHandler的类附上:
protected static class Http11Connect ...
先上个图先,一个只有我自己能看懂的url时序图.
这个基本上是connentor初始化的时候,初始化了Http11Protocol,接着初始化JIoEndpoint,初始化介绍后,connentor调用start()方法开始工作鸟,接着调用Http11Protocol,JIoEndpoint的start()方法,JIoEndpoint的start()方法大有可为,看代码:
public void start()
throws Exception {
// Initialize socket if not done before
if ...