0

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

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

我认为这个范围需要一个包含每个登录的所有会话的映射,并且它需要监听这些会话的销毁。有人可以帮我弄这个吗?

4

1 回答 1

0

我找到了以下解决方案:

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

于 2013-03-12T13:13:46.613 回答