Spring 弹簧&x27;s WebUtils.getSessionMutex(javax.servlet.http.HttpSession)和HttpSessionMutexListener仍然相关

Spring 弹簧&x27;s WebUtils.getSessionMutex(javax.servlet.http.HttpSession)和HttpSessionMutexListener仍然相关,spring,servlets,concurrency,Spring,Servlets,Concurrency,我想知道Spring框架的HttpSessionMutexListenerlistener在今天的应用服务器/web容器(比如2.5+servlet规范的服务器,如Tomcat 6或Tomcat 7)中是否仍然适用于在集群环境(即不同JVM之间)中锁定会话对象,或者他们只解决了集群环境中2.3(或以前版本)servlet规范容器的并发性问题,而现在这是不必要的吗?我认为Spring的会话互斥体的功能超出了它应有的功能。它只是一个存储在公共名称下的会话属性,WebUtils.session\u M

我想知道Spring框架的
HttpSessionMutexListener
listener在今天的应用服务器/web容器(比如2.5+servlet规范的服务器,如Tomcat 6或Tomcat 7)中是否仍然适用于在集群环境(即不同JVM之间)中锁定会话对象,或者他们只解决了集群环境中2.3(或以前版本)servlet规范容器的并发性问题,而现在这是不必要的吗?

我认为Spring的会话互斥体的功能超出了它应有的功能。它只是一个存储在公共名称下的会话属性,
WebUtils.session\u MUTEX\u attribute
,用于
synchronized
语句的表达式中。我真的不知道如何将它用于“在集群环境中锁定会话对象”。下面是Spring自己代码的一个用法片段:

HttpSession session = request.getSession(false);
if (session != null) {
    Object mutex = WebUtils.getSessionMutex(session);
    synchronized (mutex) {
        return handleRequestInternal(request, response);
    }
}
一个JVM中对
互斥对象的引用对另一个JVM不可用,因此获取其锁不会对另一个JVM中运行的代码产生任何影响。但是,servlet规范确实包含以下内容:

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

这一要求至少从2.3开始就存在了,可能会导致分布式应用程序的行为就像Spring互斥体在做什么一样,而事实上,正是容器迫使请求一次由一个JVM处理

顺便说一句,这让我想起几年前我在concurrency interest上发表的一篇文章,其中提到了Spring的会话互斥:

根据评论更新:

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


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

作为会话一部分的所有请求一次必须由一个JVM处理是什么意思?规范是否规定粘性会话是容器必须使用的技术,以保证同一会话始终由同一JVM提供服务?或者这是否意味着容器必须(以某种方式)保证,当JVM为请求提供服务时,相同的会话将以原子方式被访问?