Tomcat源码系列6--Tomcat的Session生成和管理2
下面谈一谈Session的管理。
一. Session的管理?
当tomcat启动时,会开启一个后台线程,这个后台线程是随容器的启动而启动的,它将定期检查会话超时。
(org.apache.catalina.core.ContainerBase.threadStart())?
?
1.此时会新建一个ContainerBackgroundProcessor线程。
(org.apache.catalina.core.ContainerBase.ContainerBackgroundProcessor)?public void expire(boolean notify) { if (expiring) return; synchronized (this) { if (manager == null) return; expiring = true; //唤醒相关的应用程序事件监听者 Context context = (Context) manager.getContainer(); Object listeners[] = context.getApplicationLifecycleListeners(); if (notify && (listeners != null)) { HttpSessionEvent event = new HttpSessionEvent(getSession()); for (int i = 0; i < listeners.length; i++) { int j = (listeners.length - 1) - i; if (!(listeners[j] instanceof HttpSessionListener)) continue; HttpSessionListener listener = (HttpSessionListener) listeners[j]; try { fireContainerEvent(context, "beforeSessionDestroyed", listener); listener.sessionDestroyed(event); fireContainerEvent(context, "afterSessionDestroyed", listener); } catch (Throwable t) { try { fireContainerEvent(context, "afterSessionDestroyed", listener); } catch (Exception e) { ; } manager.getContainer().getLogger().error (sm.getString("standardSession.sessionEvent"), t); } } } accessCount = 0; setValid(false); // Remove this session from our manager's active sessions if (manager != null) manager.remove(this); //唤醒相关的session事件监听者 if (notify) { fireSessionEvent(Session.SESSION_DESTROYED_EVENT, null); } // 处理完毕后,设置expiring为false expiring = false; //解除任何与此相关的session对象的绑定 String keys[] = keys(); for (int i = 0; i < keys.length; i++) removeAttributeInternal(keys[i], notify); } }?
?