是否有一个澄清,如果我正在使用"简单经纪人"那么Spring Websocket + SockJS的/ topic,/ queue等之间有什么区别? ?例如。这里Sending message to specific user on Spring Websocket说: 当您的客户订阅以/ user /开头的频道时,例如:/ user / queue / reply,您的服务器实例将订阅名为queue / reply的队列-user [会话ID]
我想以一种明确的方式理解这种转换背后的逻辑。
答案 0 :(得分:11)
你应该看看this part of the reference documentation。
简而言之,"/topic"
和"/queue"
都是配置到同一目的地的前缀。
在文档中,"/app"
是配置的“应用程序目标前缀” - 意味着通过"clientInboundChannel"
流入并匹配这些前缀的所有消息都将映射到您的应用程序,例如{{1注释。
此处,@MessageMapping
和"/topic"
都是配置为STOMP目标的前缀 - 意味着通过"/queue"
流入并匹配这些前缀的所有消息都将转发到STOMP代理。在您的情况下,这是简单的代理实现。
因此,从Spring Websocket的角度来看,"clientInboundChannel"
和"/queue"
被视为相同的方式并且是“典型的”STOMP目的地 - 所有与这些目标匹配的消息都被转发到消息代理。现在,如果您正在使用完整的消息代理实现,那些目标可能没有相同的含义,并且消息代理行为可能不同。以下是Apache Apollo和RabbitMQ的一些示例。
请注意,如果您愿意,可以更改这些前缀。但我会建议你保留这些默认值,除非你真的知道你在做什么。
答案 1 :(得分:2)
上面的答案中没有提到更大,更重要的区别。
主题是自动删除的,而队列是持久的。这意味着当websocket连接关闭时,主题及其数据将被删除。在队列中,服务器仍然可以发送消息,并且当客户端通过websocket连接时,它会接收服务器发送的旧消息。
顺便说一句,内存代理没有什么区别。使用专用经纪人时会发生这种情况。
答案 2 :(得分:1)
我认为该主题的最佳答案将来自Spring Docs
目的地的含义在STOMP中故意保持不透明 规范。 它可以是任何字符串,它完全取决于STOMP服务器 定义它们的目的语义和语法 支持。 然而,目标是路径般的很常见 字符串,其中“/ topic / ..”表示发布 - 订阅(一对多)和 “/ queue /”表示点对点(一对一)消息交换。