当前位置: 首页 > 知识库问答 >
问题:

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

孔砚
2023-03-14

我正在尝试使用SpringWebSocket和stomp创建一个聊天应用程序
我正在使用Spring 4.1.1,Stomp。js,ActiveMQ 5.9
在此用户可以通过登录应用程序向他/她的每个朋友发送消息,这些朋友也已登录。为了向特定用户发送消息,我采取以下步骤:
1)用户登录
2)用户订阅“/user/queue/messaging”目的地
这将用于相互发送用户的私人消息
3)当用户想要发送消息时,他会将其发送到目标:
/user/{user\u id}/queue/messaging,其中user\u id是收件人用户id。
我正在尝试使用STOMP从客户端发送此消息。jssend方法
4)预期行为:现在,如果收件人已登录且其会话id(例如)为DFT0GH,则步骤e中的消息应以名称messaging-userDFT0GH传递到队列目标。相反,它被传递到发送它的同一用户的队列目的地。

请找到我的示例场景:
1)用户John登录。他订阅了 /user/queue/messaging
他的用户ID是john
他的会话ID是ABCD01
队列是以激活代理上的名称作为消息传递-用户ABCD01创建的

2)用户Alice登录。
她订阅了 /user/queue/messaging
他的用户ID是alice
她的会话ID是XYZ01
队列是以激活代理上的名称作为消息创建的-userXYZ01

3)用户John通过STOMP. js发送方式发送消息给Alice,目的地为/user/alice/队列/消息

4) 现在,不再将消息传递到队列消息传递-UserXYZ01,而是将消息传递到John的队列目的地,即消息传递-userABCD01。为什么会这样?

当我对此进行调试时,在DefaultUserDestinationResolver类的方法private DestinationInfo parseUserDestination(Message Message)中发现了以下行:

  if (SimpMessageType.MESSAGE.equals(messageType)) {
        ........
    sessionIds = (sessionId != null ?
                Collections.singleton(sessionId) : this.userSessionRegistry.getSessionIds(user));      
    }

在此会话中,sessionId被登录到用户的(主体)会话id中,该会话id在用户登录时不为null,因此,即使预期的收件人用户不同,也会返回他的sessionId并将消息传递到他的队列
当我检查usersessionregistry的SessionID集合时,我发现一个条目[alice]:XYZ01
如果用户不是登录到用户的会话来标识目标队列,则不应在行上返回会话id。?

对不起,我是第一次尝试这个。因此,如果我遗漏了任何内容,请告诉我有什么方法可以满足我的用例,或者我的用例本身是无效的。

提前谢谢。

共有1个答案

隗驰
2023-03-14

所以这个问题不在未回答列表中——这确实是一个错误,你把它作为SPR-12444提出来了。

这将在Spring框架4.1.3中固定。

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

 类似资料:
  • 我是新手。NET(C#)和WebSocket。。。我已经安装了VS2012和Windows Server 2012,并且已经启动并运行了WebSocket。我似乎无法从一个套接字接收消息并将其发送到另一个特定的套接字。唯一的选择似乎是向所有套接字广播消息。有没有一种方法可以将消息只发送给特定的用户?我希望聊天室主持人有机会拒绝不适当的帖子。

  • 我阅读了关于用户目的地的Spring文档。我想使用方法仅向特定用户发送消息。 这是java代码: 这是客户端js代码: 首先,考虑用户价值是否正确? StampClient.connect("myuser",... 为什么这个测试不起作用?此用户未收到任何消息。如果我将目的地切换到,并将方法更改为,这将起作用,但显然是作为广播,而不仅仅是根据请求发送给特定用户。 我试图设置一个回复单用户与此代码:

  • 我使用本教程中描述的spring设置了一个WebSocket:https://spring.io/guides/gs/messaging-stomp-websocket/。我需要的是我的服务器每5秒向特定用户发出一条消息。所以我首先做了这个: 而且起作用了。现在,为了只向特定用户发送消息,我更改了以下内容: 在WebSocketConfig.java中添加队列: 更改GreetingControl

  • 问题内容: 我编写了用于向 所有 用户广播消息的代码: 请注意: 我没有任何用户参考,只有一个连接。 所有用户连接均存储在中。 目标 :假设Node.js服务器希望将消息发送到特定客户端(约翰)。NodeJs服务器如何知道John拥有哪个连接?Node.js服务器甚至都不认识John。它所看到的只是连接。 因此,我相信现在,我不应该仅通过用户连接来存储用户,而是需要存储一个对象,其中将包含和对象。

  • 我正在存放插座。每个用户使用redis登录时的id 当这个用户的任何帖子。_id被创建时,我试图使用上面存储的socket.id向那个特定用户的套接字发出一个事件 问题是我无法使用上述代码向该特定套接字发出。我正在使用套接字。io版本

  • 假设我在MongoDB中有以下模式: 每个帖子必须有一个所有者,并且可能有许多贡献者(由所有者添加)。 当所有者或任何贡献者对post对象进行更改时,我需要将该更改实时通知给所有相关的用户(使用Socket。IO)。 但是我对如何做到这一点有一些疑问...我的意思是,我知道 Socket.IO 有一些方法可以向特定用户发出消息,但我们需要知道 SocketID。如何将用户 ID 与套接字 ID 相