我在春季论坛上也posted this,但我认为我会给这里的人们增添声誉:
对于在集群环境中运行的普通旧servlet应用程序(会话复制/故障转移),如果会话属性已被修改,则最好“重新设置”会话属性:
UserPreferences prefs = (UserPreferences)session.getAttribute("userPreferences");
prefs.setInstantEmail(true);
session.setAttribute("userPreferences", prefs);
这充当容器的标志,会话状态已更改并且需要复制。 Here's a reference关于该主题的一些WLS文档。
我正在修改的应用程序使用Spring来支持POJO + Injection的开发风格,我不清楚上述实践的翻译方式。根据Spring文档Scoped beans as dependencies,应用程序使用<aop:scoped-proxy/>
来注入会话范围的依赖项。但是,如果没有直接访问会话,那么对该依赖项的更改如何标记到容器以便可以进行复制?是否内置了代理或Web上下文来支持它?如果没有,有没有人有他们如何处理它的例子?
感谢您的任何见解。
基于axtavt's answer的澄清:
遵循POJO + Injection方法的项目之一是避免直接依赖Java EE或Spring类。我可以想象Spring可能会暴露一些钩子来从一个上下文中检索bean,这个上下文可以提供一个位置来至少跟踪已经使用了哪些会话范围的bean。另一种可能是声明会话范围bean上的方法集,在调用时,可以触发状态更改。不熟悉Spring,我只能在不知道技术细节的情况下猜测似乎的可能性。
查看一些Spring代码后的后续问题:
任何人都可以阐明ServletRequestAttributes
可能扮演的角色吗?看起来它的getAttribute
方法跟踪检索了哪些属性,然后其updateAccessedSessionAttributes
方法尝试“重新设置”它认为已更改的属性。
答案 0 :(得分:0)
这里没有内置支持。
通过查看代码,您可以按如下方式手动执行:
RequestAttributes a = RequestContextHolder.currentRequestAttributes();
String name = ScopedProxyUtils.getTargetBeanName("...your bean name...")
synchronized (a.getSessionMutex()) {
Object o = a.getAttribute(name, RequestAttributes.SCOPE_SESSION);
a.setAttribute(name, o, RequestAttributes.SCOPE_SESSION);
}
答案 1 :(得分:0)
事实证明,我能够与SpringSource支持人员交谈,他们确认ServletRequestAttributes
是负责“重新设置”的实体。