读书人

tomcat session治理

发布时间: 2012-10-23 12:12:22 作者: rapoo

tomcat session管理

最近有空看了一下tomcat 6源码里面对session管理的实现,现在写下来,以供后考,也希望能对对此感兴趣的朋友

有所提示。

?

闲话少说,先贴一下tomcat6的component层次图(此图来自tomcat doc)

? Server?????????????????????????????????????????就是一个servlet container
?????????? |
???????? Service?????????????????????????????????包含一个或多个connector的组????????
?????????? |
???????? Engine????????????????????????????????? servlet engine.最顶级的container.
?????????? |? \
?????????? |? --- Cluster --*
?????????? |
???????? Host??????????????????????????????????????第二级container
?????????? |
???????? ------
??????? /????? \
???? Cluster??? Context(1-N)?????????????第三级container.?servlet context.?也就是一个应用。
??????? |???????????? \
??????? |???????????? -- Manager?????????????? 应用的session管理器
??????? |?????????????????? \
??????? |?????????????????? -- DeltaManager
??????? |?????????????????? -- BackupManager
??????? |
???? ---------------------------
??????? |?????????????????????? \
????? Channel??????????????????? \
??? ----------------------------- \
??????? |????????????????????????? \
???? Interceptor_1 ..?????????????? \
??????? |??????????????????????????? \
???? Interceptor_N??????????????????? \
??? -----------------------------????? \
???? |????????? |???????? |???????????? \
?? Receiver??? Sender?? Membership?????? \
???????????????????????????????????????? -- Valve
???????????????????????????????????????? |????? \
???????????????????????????????????????? |?????? -- ReplicationValve
???????????????????????????????????????? |?????? -- JvmRouteBinderValve
???????????????????????????????????????? |
???????????????????????????????????????? -- LifecycleListener
???????????????????????????????????????? |
???????????????????????????????????????? -- ClusterListener
???????????????????????????????????????? |????? \
???????????????????????????????????????? |?????? -- ClusterSessionListener
???????????????????????????????????????? |?????? -- JvmRouteSessionIDBinderListener
???????????????????????????????????????? |
???????????????????????????????????????? -- Deployer
??????????????????????????????????????????????? \
???????????????????????????????????????????????? -- FarmWarDeployer
?????

OK,基本层级关系说过了,就开始分析session的管理。

1. session 的创建。

?? 更正:下面这段我理解错了。其实进一步看下来,发现其实session的创建是在每个context里面。具体的创建可以看我

?? 这篇之后的那篇文章. Session的生成实际是在调用最终处理的servlet的时候生成的。

??? session的创建的入口是在Host里面,每次request进来之后,会沿着container 的pipeline一直往下进行、

??? 处理,顺序是:engine->host->context->wrapper. 而pipeline的作用就是调用对应级别的value对

?? request和response进行处理。在StandardHostValue里面首先出现对session的调用:

?

?

? 很显然,session的有效性管理也通过session具体实现的。比如DeltaSession:

??

 public void expire(boolean notify, boolean notifyCluster) {        if (expiring)            return;        String expiredId = getIdInternal();        if(expiredId != null && manager != null &&           manager instanceof DeltaManager) {            DeltaManager dmanager = (DeltaManager)manager;            CatalinaCluster cluster = dmanager.getCluster();            ClusterMessage msg = dmanager.requestCompleted(expiredId, true);            if (msg != null) {                if(dmanager.doDomainReplication()) {                    cluster.sendClusterDomain(msg);                } else {                    cluster.send(msg);                }            }        }        super.expire(notify);        if (notifyCluster) {            if (log.isDebugEnabled())                log.debug(sm.getString("deltaSession.notifying",                                       ((ClusterManager)manager).getName(),                                        new Boolean(isPrimarySession()),                                        expiredId));            if ( manager instanceof DeltaManager ) {                ( (DeltaManager) manager).sessionExpired(expiredId);            }        }    }

?

??? 可以看出,当session失效的时候,manager会广播这个消息。

读书人网 >软件架构设计

热点推荐