Gab*_*res 3 concurrency spring servlets
我想知道Spring框架的HttpSessionMutexListener监听器是否仍然与今天的应用服务器/ Web容器(比如2.5 + servlet规范服务器,如Tomcat 6或Tomcat 7)相关,用于在集群环境中锁定会话对象(即在不同的JVM之间) ,或者他们只解决2.3(或以前)servlet规范容器的集群环境中的并发问题,现在它是不必要的?
我认为你给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);
}
}
Run Code Online (Sandbox Code Playgroud)
对mutex一个JVM中的对象的引用将不可用于另一个JVM,因此获取其锁定不会对在另一个JVM中运行的代码产生任何影响.但是,servlet规范确实包含以下内容:
在标记为可分发的应用程序中,属于会话的所有请求必须一次由一个JVM处理.
这一要求已自至少为2.3,可能会导致分布式应用程序表现得好像春天互斥正在做东西的时候,其实,它是迫使请求被一个JVM在时间处理的容器.
顺便说一下,这让我想起了几年前我对并发感兴趣的帖子,指的是Spring的会话互斥:
根据评论更新:
假设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)是可见的.
| 归档时间: |
|
| 查看次数: |
3343 次 |
| 最近记录: |