我想知道Spring框架的HttpSessionMutexListener
监听器是否仍然适用于今天的应用程序服务器/ Web容器(比如像Tomcat 6这样的2.5+ servlet规范服务器或者Tomcat 7)用于在集群环境中锁定会话对象(即在不同的JVM之间),还是只解决2.3(或以前的)servlet规范容器的集群环境中的并发问题,现在它是不必要的?
答案 0 :(得分:6)
我认为你给Spring的会话互斥量赋予了更多的力量。它只是一个存储在公共名称WebUtils.SESSION_MUTEX_ATTRIBUTE
下的会话属性,旨在用于synchronized
语句的表达式。我不确定它如何用于“在集群环境中锁定会话对象”。这是Spring自己的代码的用法片段:
HttpSession session = request.getSession(false);
if (session != null) {
Object mutex = WebUtils.getSessionMutex(session);
synchronized (mutex) {
return handleRequestInternal(request, response);
}
}
对一个JVM中的mutex
对象的引用将无法用于其他JVM,因此获取其锁定不会对在另一个JVM中运行的代码产生任何影响。但是,servlet规范确实包含以下内容:
在标记为可分发的应用程序中,所有请求都是 会话的一部分必须一次由一个JVM处理。
此要求至少已经存在2.3并且可能导致分布式应用程序的行为就好像Spring互斥锁正在执行某些操作,实际上,它是强制请求由一个JVM在一时间处理的容器。 / p>
顺便说一句,这让我想起了几年前我对并发感兴趣的帖子,指的是Spring的会话互斥:
JTaP article on stateful web apps
根据评论更新:
假设JVM-1和JVM-2组成了一个集群中的两个节点。还假设request-1和request-2参与同一会话。如果在JVM-1中处理request-1,则在request-1完成之前,无法在JVM-2中处理request-2。但是,JVM-1可以同时处理request-2 。
对于在不同JVM中处理请求的情况,暗示第一个请求(JVM-1)引起的任何会话更改对第二个请求(JVM-2)都是可见的。