我正在尝试使用弹簧websocket和stomp创建一个聊天应用程序
我使用的是Spring 4.1.1,Stomp.js,ActiveMQ 5.9
在此用户可以通过登录应用程序向他/她的同时登录的朋友发送消息。
为了向特定用户发送消息,我采取以下步骤:
1)用户登录
2)用户订阅“/ user / queue / messaging”目的地
这将用于向用户发送用户的私人消息
3)当用户想要发送消息时,他将其发送到目的地:
/ user / {user_id} / queue / messaging其中user_id是收件人用户ID
我试图使用STOMP.js发送方法从客户端发送此信息
4)预期行为:现在,如果收件人已登录并且他的会话ID(例如,DFT0GH),那么步骤e中的消息应该通过名称messaging-userDFT0GH传递到队列目的地。而不是将其传递给发送它的同一用户的队列目的地。
请找我的示例场景:
1)用户John登录。
他订阅了/ user / queue / messaging
他的用户名是john
他的会话ID是ABCD01
在activemq代理上使用名称创建队列
messaging- userABCD01
2)用户Alice登录。
她订阅了/ user / queue / messaging
他的用户名是alice
她的会话ID是XYZ01
在activemq代理上使用名称创建队列作为messaging- userXYZ01
3)用户John通过STOMP.js发送方法向Alice发送消息 使用目的地为“/ user / alice / queue / messaging”
4)现在不是将消息传递给队列 messaging- UserXYZ01它被传递到John的队列目的地,即 messaging- userABCD01。为什么会这样?
当我调试这个时,我在方法中找到了以下行 DefaultUserDestinationResolver类的私有DestinationInfo parseUserDestination(消息消息):
if (SimpMessageType.MESSAGE.equals(messageType)) {
........
sessionIds = (sessionId != null ?
Collections.singleton(sessionId) : this.userSessionRegistry.getSessionIds(user));
}
在此sessionId中记录用户的(Principal)会话ID,该ID在用户登录时不为空,因此即使预期的收件人用户不同,也会返回其sessionIds并将消息传递到其队列。 当我检查usersessionregistry的sessionIds集合时,我找到一个条目[alice]:XYZ01 如果用户不是登录用户的会话来识别目标队列,那么不应该返回行返回会话ID。?
对不起,我是第一次尝试这个。所以,如果我在这里遗漏任何东西,请告诉我
1)满足我的用例的任何方式
2)或我的用例本身无效。
提前致谢。
答案 0 :(得分:2)
因此,这个问题不在未答复的列表中 - 这确实是一个错误,您将其提升为SPR-12444。
这将在Spring Framework 4.1.3中修复。
作为旁注,我想指出,如果您使用多个实例部署应用程序,默认情况下不会在实例之间共享会话注册表 - 因此这会在从alice发送消息时导致问题(与服务器#1的会话到bob(与服务器#2的会话)。