首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring的WebUtils.getSessionMutex(javax.servlet.http.HttpSession)和HttpSessionMutexListener仍然相关

Spring的WebUtils.getSessionMutex(javax.servlet.http.HttpSession)和HttpSessionMutexListener仍然相关
EN

Stack Overflow用户
提问于 2011-12-07 06:51:25
回答 1查看 3.8K关注 0票数 3

我想知道Spring框架的HttpSessionMutexListener侦听器在今天的应用服务器/web容器(比如Tomcat6或Tomcat7等2.5+ servlet规范服务器)中是否仍然适用于锁定集群环境中的会话对象(即。在不同的JVM之间),或者它们只解决了2.3 (或以前的) servlet规范容器的集群环境中的并发问题,现在不需要了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-13 02:55:01

我认为你给了Spring的会话互斥更多的权力,而不是它应得的。它只是一个存储在公共名称WebUtils.SESSION_MUTEX_ATTRIBUTE下的会话属性,打算在synchronized语句的表达式中使用。我不太确定如何使用它来“锁定集群环境中的会话对象”。下面是Spring自己的代码中的一个用法片段:

代码语言:javascript
复制
HttpSession session = request.getSession(false);
if (session != null) {
    Object mutex = WebUtils.getSessionMutex(session);
    synchronized (mutex) {
        return handleRequestInternal(request, response);
    }
}

对一个JVM中的mutex对象的引用对于另一个JVM是不可用的,因此获取它的锁不会对在另一个JVM中运行的代码产生任何影响。但是,servlet规范包含以下内容:

在标记为可分发的应用程序中,作为会话一部分的所有请求必须一次由一个

处理。

这一要求至少在2.3版本中就已经存在,可能会导致分布式应用程序表现得好像Spring互斥锁在做一些事情,而实际上,它是强制由一个JVM处理请求的容器。

顺便说一句,这让我想起了几年前我写给concurrency-interest的一篇文章,那篇文章提到了Spring的会话互斥:

JTaP article on stateful web apps

根据评论进行更新:

假设JVM-1和JVM-2组成集群中的两个节点。还假设request-1和request-2参与同一会话。如果请求-1在JVM-1中处理,那么在请求-1完成之前,请求-2不能在JVM-2中处理。但是,request-2可以由JVM-1并发处理。

对于在不同JVM中处理请求的情况,这意味着由第一个请求(JVM-1)引起的任何会话更改对于第二个请求(JVM-2)都是可见的。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8408049

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档