春季会话bean如何保存?通过Hazelcast复制春季会话bean

时间:2014-10-01 15:10:22

标签: java spring session web hazelcast

我试图整合Hazelcast(持续版本 - 3.3)会话复制。

我们的基础设施包括:

  • 用于负载平衡的Apache 2.0服务器
  • 为我们的网络应用程序提供服务的Tomcat 7服务器

我们的主要原因是:

  • 重复用户会话以获得高可用性
  • Atmosphere web-socket PubSub servlet需要共享相同的数据才能完整 广播

将Hazelcast整合到我们的环境中:

  • 每个tomcat服务器都将充当Hazelcast成员

  • 基本上是Hazelcast WebFilter是第一个执行它的人 换行:WebFilter-> HazelcastSession-> setAttribute()实现 HttpSession界面

  • 每次调用setAttribute时,Hazelcast会同步会话属性 与其他集群成员一起使用。

现在 - 它看起来像我们注入作为会话bean的每个Spring bean都没有被复制。

作为解决方法:

  1. 仅通过@Context注释保存基本会话信息
  2. 不要使用Spring会话范围,只使用Singletons并注入HazelcastInstance
    我可以将相关数据包装为Hazelcast结构
  3. 另外,当我查看其他stackoverflow时,我看到以下内容:Spring "session" scope of a bean

      

    Spring会话与HttpSession并不完全匹配,甚至   关于@SessionAttributes注释的Spring文档说   它可能存储在会话中,或者是某些会话   存储&#34 ;.我从[The Spring docs for 2.5] [1]基本上得到了这个   如果我这样做,那就试着理解它,然后继续我的生活   想要存储在HttpSession中的东西,我只需要Spring注入   HttpSession给我,假设您使用Spring MVC非常漂亮   简单,同一页面上的说明。

         

    [1]:   http://static.springsource.org/spring/docs/2.5.x/reference/mvc.html

    它看起来很奇怪,Spring会话bean与HttpSession.setAttribute不完全匹配吗? 春天如何知道@Inject正确的bean?

    • 也许Spring将Beans保存在内部数据存储中,而且只保存在 注入阶段Spring使用相同的元素获得适当的元素 session id属性并绑定正确的bean。
    • 有没有办法控制这种行为?

    更新:

    • 调试spring-web - > ServletRequestAttributes->正在使用 Server impl HTTPSession(例如 - 在Dev Jetty中 - org.eclipse.jetty.server.session.HashedSession)
    • 这样Bean在HTTPSession中更新但跳过了 HazelcastSession: - (

    /**
     * Update all accessed session attributes through {@code session.setAttribute}
     * calls, explicitly indicating to the container that they might have been modified.
     */
    @Override
    protected void updateAccessedSessionAttributes() {
        // Store session reference for access after request completion.
        this.session = this.request.getSession(false);
        // Update all affected session attributes.
        if (this.session != null) {
            try {
                for (Map.Entry<String, Object> entry : this.sessionAttributesToUpdate.entrySet()) {
                    String name = entry.getKey();
                    Object newValue = entry.getValue();
                    Object oldValue = this.session.getAttribute(name);
                    if (oldValue == newValue) {
                        this.session.setAttribute(name, newValue);
                    }
                }
            } catch (IllegalStateException ex) {
                // Session invalidated - shouldn't usually happen.
            }
        }
        this.sessionAttributesToUpdate.clear();
    }
    
    提前谢谢, ELAD。

0 个答案:

没有答案