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里面执行的。
剩下的也都是一个比较正常的实现,没什么说的自己多看看代码就成了。

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通知,则是在一个单独的线程中执行的。

明天写store。没多少东西了