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

标签 spring stomp spring-websocket

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

请查找我的示例场景:
1) 用户 John 登录。 他订阅了/user/queue/messaging
他的用户 ID 是 john
他的 session ID 是 ABCD01
队列是在 activemq 代理上创建的,名称为 消息传递- userABCD01

2) 用户 Alice 登录。
她订阅了/user/queue/messaging
他的用户ID是alice
她的 session ID 是 XYZ01
队列在 activemq 代理上创建,名称为 messages- u​​serXYZ01

3)用户John通过STOMP.js send方法向Alice发送消息 使用目的地作为“/user/alice/queue/messaging”

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 中记录了用户(主体)的 session ID,当用户登录时,该 ID 不为空,因此即使预期的接收用户不同,也会返回他的 sessionId,并将消息传递到他的队列。
当我检查 usersessionregistry 的 sessionIds 集合时,我发现一个条目 [alice]:XYZ01。
如果用户而不是登录用户 session 来识别目标队列,上面的行不应该返回 session ID。?

抱歉,我是第一次尝试这个。因此,如果我错过了这里或那里的任何内容,请告诉我
1)任何满足我的用例的方法
2)或者我的用例本身无效。

提前致谢。

最佳答案

这样这个问题就不会出现在未回答的列表中 - 这确实是一个错误,您将其提出为 SPR-12444 .

这将在 Spring Framework 4.1.3 中修复。

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

关于spring - 无法使用 Spring Websocket STOMP 发送特定于用户的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26967034/

相关文章:

java - 带有 Dynomite 的自定义 spring-session 存储库 Redis

java - 将 spring 项目中的 database.properties 包含到 web.xml 中

java - Spring jpa 禁用合并

java - Grails 应用程序未部署在 tomcat 中

java - 如何使用websocket获取消息?

java - Spring MVC + Stomp + WebSocket + https 不作为 http

go - Go-Stomp读取超时如何解决

Spring STOMP 配置相互认证 wss/ssl

java - javascript STOMP 客户端是否在浏览器/前端 js 中工作?

java - 是否可以在 Spring 启动时将Web套接字与rest api一起使用?