我想知道Spring框架的HttpSessionMutexListener侦听器在今天的应用服务器/web容器(比如Tomcat6或Tomcat7等2.5+ servlet规范服务器)中是否仍然适用于锁定集群环境中的会话对象(即。在不同的JVM之间),或者它们只解决了2.3 (或以前的) servlet规范容器的集群环境中的并发问题,现在不需要了?
发布于 2011-12-13 02:55:01
我认为你给了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规范包含以下内容:
在标记为可分发的应用程序中,作为会话一部分的所有请求必须一次由一个
处理。
这一要求至少在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)都是可见的。
https://stackoverflow.com/questions/8408049
复制相似问题