Tomcat从零开始(十三)Session第二部分
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中。StandardManagerStandardManager这个类实现了Lifecycle接口,把session存储到内存中。因为Lifecycle的原因,所以stop方法可以调用unload方法,把session的实例存储到文件中。所以我们可以推测出,load就是从文件中读取到内存中。