代码之家  ›  专栏  ›  技术社区  ›  Fernando Camargo

如何使Spring的自定义作用域在两个或多个会话之间共享信息?

  •  0
  • Fernando Camargo  · 技术社区  · 13 年前

    我们有一个包含聊天的应用程序。我们正在使用Node.JS的IO套接字向客户端进行推送。经过身份验证后,客户端正在连接到一个以他/她的id作为房间标识符的房间。我们这样做是因为有一些单身人士会向客户端推送一些通知,而与他/她的会话无关。聊天的春季bean是SessionScoped。 当同一个客户端使用两个不同的浏览器登录系统时,就会出现我们面临的问题。创建了两个会话,所以有两个spring-beans的聊天操作。由于两个bean都推送到由用户id标识的房间,因此在客户端,相同的消息会到达两次。重复消息的数量会随着浏览器的数量而增加。

    所以,我想为Spring创建一个自定义范围。此作用域必须在使用同一登录登录的所有客户端之间共享,并且必须在使用此登录登录登录的全部会话被销毁后立即销毁。

    我认为这个范围需要一个映射,其中包含每次登录的所有会话,并且需要监听这些会话的破坏情况。有人能帮我吗?

    1 回复  |  直到 13 年前
        1
  •  0
  •   Fernando Camargo    13 年前

    我找到了以下解决方案:

    我创建了一个spring的singleton bean,它有一个使用Guava的MapMaker创建的Map。该映射具有弱值(有关弱引用的详细信息,请点击此处: http://weblogs.java.net/blog/2006/05/04/understanding-weak-references ). 然后我有了一个春季会话bean。这个会话bean向singleton请求一个用于传递客户端id的聊天的实例。singleton,验证映射中是否有内容。如果没有,它会创建一个新的聊天实例,放入映射并返回它。会话bean为这个聊天实例维护一个引用。如果用户在不同的浏览器中登录,一个新的会话bean也会执行同样的操作。这一次,它将获得保存在地图中的实例。当没有更多引用聊天实例的会话bean时,它将被垃圾收集,因为映射对它有一个弱引用。