无法使用Spring Websocket STOMP向用户发送特定于消息的消息

时间:2014-11-17 06:47:21

标签: spring stomp spring-websocket

我正在尝试使用弹簧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)或我的用例本身无效。

提前致谢。

1 个答案:

答案 0 :(得分:2)

因此,这个问题不在未答复的列表中 - 这确实是一个错误,您将其提升为SPR-12444

这将在Spring Framework 4.1.3中修复。

作为旁注,我想指出,如果您使用多个实例部署应用程序,默认情况下不会在实例之间共享会话注册表 - 因此这会在从alice发送消息时导致问题(与服务器#1的会话到bob(与服务器#2的会话)。