Tomcat从零开始(十三)Session第二部分
来源:互联网 发布:stl源码剖析 代码 编辑:程序博客网 时间:2024/06/08 04:32
Manager
这次要讲的就是 session的 Manager ,每一个session的生成直到销毁,都是依靠于Manager来实现的。
这回主要要说的就是Manager。Manager是一个接口(org.apache.catalina.Manager)。按照tomcat的逻辑,我们可以在org.apache.catalina.session中找到ManagerBase类,不用多说,跟req和reps一样,这就是一个通用功能的实现类,而他有两个直接子类,分别是StandardManager和PersistentManagerBase。
从名字就得出,前一个就是一个标准manager实现,用来管理内存中的session,而后者一个persisent持久,就是是把session加入到一个文件中去。PersistentManagerBase的子类就一个就是PersistentManager和DistributedManager。
我们先来看看Manager的源码。
package org.apache.catalina; import java.beans.PropertyChangeListener; import java.io.IOException; public interface Manager { public Container getContainer(); public void setContainer(Container container); public DefaultContext getDefaultContext(); public void setDefaultContext(DefaultContext defaultContext); public boolean getDistributable(); public void setDistributable(boolean distributable); public String getInfo(); public int getMaxInactiveInterval(); public void setMaxInactiveInterval(int interval); public void add(Session session); public void addPropertyChangeListener(PropertyChangeListener listener);public Session createSession(); public Session findSession(String id) throws IOException;public Session[] findSessions(); public void load() throws ClassNotFoundException, IOException; public void remove(Session session); public void removePropertyChangeListener(PropertyChangeListener listener); public void unload() throws IOException; }我们可以发现,setContainer就是设置与之关联的context,XXXMaxInactiveInterval就是用来设置session的最大等待时间,add这个方法就是添加一个session到Session池中(其实就是一个hashmap),remove就不用说了,unloaded和Load是manager中的一种持久化机制,load就是将Session从指定目录加载到内存中,unload则是存储。find也不用说了。
ManagerBase
其实我觉得ManagerBase这个东西,存在很有必要,他把子类共有的方法给抽取出来,从而组合成一个抽象类,这样很好,避免了很多的重复代码。之后管理session对象,如果一个Session是active的,那么他就会被存储在ManagerBase中的sessions这个hashmap中。
StandardManager
StandardManager这个类实现了Lifecycle接口,把session存储到内存中。因为Lifecycle的原因,所以stop方法可以调用unload方法,把session的实例存储到文件中。所以我们可以推测出,load就是从文件中读取到内存中。
在tomcat4中,销毁Session应用的是一个线程,不断的来循环,比较Session的存活时间(maxInactiveInterval),而tomcat5则是在backgroundProcess里面执行的。
剩下的也都是一个比较正常的实现,没什么说的自己多看看代码就成了。
在tomcat4中,销毁Session应用的是一个线程,不断的来循环,比较Session的存活时间(maxInactiveInterval),而tomcat5则是在backgroundProcess里面执行的。
剩下的也都是一个比较正常的实现,没什么说的自己多看看代码就成了。
PersistentManagerBase
PersistentManagerBase也是一个抽象类,它与StandardManager的区别是它创建的session存储在store中,Store代表着一个二级存储器。这个会在下节课讲。在这个类中,每个session都可以被backup或者 swap out,当back up的时候,session回复制一个到store中。而当服务器当机的时候,session对象还可以从store中取出来。 第二种swap out发生在session数量过多或者Session长时间没有访问的时候。剩下的PersistentManager没什么说的了,他就是一个实现。没多说能说的地方。
DistributedManager
这个一般就是在集群中使用,就是同步Session,这个我再以前提到过。这个类就是为了同步Session而作的, 在session发生变化(创建或销毁等)时,每个节点都可以接收DistributedManager发送的通知,当然也可以发送通知。能过这种方式来保证session同步,这样集群中的每个节点都可以处理请求。
通知的发送与接收都由专门的类进行操作。这两类在org.apache.catalina.cluster包中,ClusterSender与ClusterReceiver分别负责发送与接收通知。
Session会在创建时,ClusterSender会以流的方式发送给其他节点,而session的销毁以及接收session通知,则是在一个单独的线程中执行的。
通知的发送与接收都由专门的类进行操作。这两类在org.apache.catalina.cluster包中,ClusterSender与ClusterReceiver分别负责发送与接收通知。
Session会在创建时,ClusterSender会以流的方式发送给其他节点,而session的销毁以及接收session通知,则是在一个单独的线程中执行的。
明天写store。没多少东西了
- Tomcat从零开始(十三)Session第二部分
- Tomcat从零开始(十二)Session第一部分
- Tomcat从零开始(十四)session的store
- Tomcat从零开始(十五)session管理的代码
- 从零开始学Makefile(十三)
- Netty in Action (十三) 第五章节 第二部分 ByteBuf字节层面的操作
- Tomcat从零开始(一)
- Tomcat从零开始(五)
- Tomcat从零开始(六)容器
- Tomcat从零开始(八)Lifecycle
- Tomcat从零开始(九)Logger
- Tomcat从零开始(十)Loader
- Tomcat从零开始(七)tomcat容器概述
- Android0908<十三>(部分Service、 ContentProvider、 BroadcastReceiver)
- (二十三)JDK8的部分特性
- 从零开始Android游戏编程(第二版)
- 从零开始Android游戏编程(第二版)
- Tomcat 5集群中的SESSION复制 第一部分
- #define and typedef
- C语言百分号转义
- Altium Designer学习的一点总结
- ubuntu12.04 安装 ruby1.9.3
- 关于装ubuntu时候没有设置root密码的骚年们 福利来了
- Tomcat从零开始(十三)Session第二部分
- calloc(), malloc(), realloc(), free(),alloca()
- Ubuntu中用vsftpd搭建FTP服务器笔记
- jquery easyui datebox 的使用需要注意的问题
- c# 中Bitmap, byte[] ,Stream 文件相互转换
- oracle如何获得客户端sql执行计划以便优化sql(三)
- Mvc示例代码调试之一----调试工具及设置(用firebug与vs联合调试)
- 1003_(1)接受字符串
- 封装函数设置I/O的阻塞模式和非阻塞模式