我们有一个包含聊天的应用程序。我们正在使用Node.JS的IO Socket来推动客户端。经过身份验证后,客户端将以他/她的ID作为房间的标识符连接到房间。我们之所以这样做,是因为有些单身人士向客户推送一些通知,与他/她的会话无关。聊天的spring bean是SessionScoped。 当同一客户端在具有两个不同浏览器的系统中登录时,我们遇到的问题就出现了。创建了两个会话,因此聊天操作有两个春天的bean。由于两个bean都推送到用户ID标识的房间,因此在客户端,同一消息到达两次。重复邮件的数量随浏览器数量的增加而增加。
所以,我想为Spring创建一个自定义范围。此范围必须在使用相同登录名登录的所有客户端之间共享,并且必须在用此登录名登录的所有会话都被销毁后立即销毁。
我认为这个范围需要一个包含每个登录的所有会话的地图,并且它需要监听这些会话的销毁。有人可以帮我这个吗?
答案 0 :(得分:0)
我找到了以下解决方案:
我创建了一个spring的单例bean,它有一个用Mapava的Guava创建的Map。地图的值很弱(更多关于弱引用的地方:http://weblogs.java.net/blog/2006/05/04/understanding-weak-references)。然后我有一个spring的会话bean。此会话bean询问单例是否有通过客户端ID的聊天实例。单身人士,验证地图中是否有东西。如果没有,它会创建一个新的聊天实例,放入地图并返回它。会话bean维护此聊天实例的引用。如果用户在不同的浏览器中登录,则新的会话bean也会这样做。这一次,它会将实例保存在地图中。当没有更多会话bean引用聊天实例时,它将被垃圾收集,因为地图有一个弱引用。