【问题标题】:Spring built-in replication support for session-scoped beans?Spring 对会话范围的 bean 的内置复制支持?
【发布时间】:2011-05-18 18:11:17
【问题描述】:

我在 Spring 论坛中也有 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/> 注入会话范围的依赖项。但是,如果没有直接访问会话,如何将该依赖项的更改标记到容器以便进行复制?代理或网络上下文中是否有内置的东西来支持它?如果没有,有没有人举例说明他们是如何处理的?

感谢您的任何见解。

基于axtavt's answer的澄清:

遵循 POJO+Injection 方法的项目目标之一是避免直接依赖于 Java EE 或 Spring 类。我可以想象 Spring 可能会暴露一些钩子来从上下文中检索 bean,这可以提供一个位置来至少跟踪哪些会话范围的 bean 已被使用。另一种可能性可能是在会话范围的 bean 上声明一组方法,这些方法在调用时可能会触发状态更改。由于对 Spring 不是很熟悉,我只能在不了解技术细节的情况下猜测 似乎 的可能性。

查看一些 Spring 代码后的后续问题:

谁能解释ServletRequestAttributes 可能扮演的角色?看起来它的getAttribute 方法跟踪已检索到哪些属性,然后其updateAccessedSessionAttributes 方法尝试“重新设置”它认为已更改的属性。

【问题讨论】:

    标签: java spring servlets


    【解决方案1】:

    哪里没有对此的内置支持。

    通过查看代码,您可以手动执行以下操作:

    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);
    }
    

    【讨论】:

    • 感谢您抽出宝贵时间回复,我已根据您的回答添加了一些其他信息。
    【解决方案2】:

    事实证明,我能够与 SpringSource 支持人员交谈,他证实 ServletRequestAttributes 是负责执行“重置”的实体。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-16
      • 2012-10-31
      • 1970-01-01
      • 1970-01-01
      • 2013-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多