Spring Websocket + SockJS中SimpleMessageBroker的/ topic,/ queue之间的区别

时间:2016-06-16 08:27:52

标签: java spring stomp spring-websocket sockjs

是否有一个澄清,如果我正在使用"简单经纪人"那么Spring Websocket + SockJS的/ topic,/ queue等之间有什么区别? ?例如。这里Sending message to specific user on Spring Websocket说: 当您的客户订阅以/ user /开头的频道时,例如:/ user / queue / reply,您的服务器实例将订阅名为queue / reply的队列-user [会话ID]

我想以一种明确的方式理解这种转换背后的逻辑。

3 个答案:

答案 0 :(得分:11)

你应该看看this part of the reference documentation。 简而言之,"/topic""/queue"都是配置到同一目的地的前缀。

在文档中,"/app"是配置的“应用程序目标前缀” - 意味着通过"clientInboundChannel"流入并匹配这些前缀的所有消息都将映射到您的应用程序,例如{{1注释。

此处,@MessageMapping"/topic"都是配置为STOMP目标的前缀 - 意味着通过"/queue"流入并匹配这些前缀的所有消息都将转发到STOMP代理。在您的情况下,这是简单的代理实现。

因此,从Spring Websocket的角度来看,"clientInboundChannel""/queue"被视为相同的方式并且是“典型的”STOMP目的地 - 所有与这些目标匹配的消息都被转发到消息代理。现在,如果您正在使用完整的消息代理实现,那些目标可能没有相同的含义,并且消息代理行为可能不同。以下是Apache ApolloRabbitMQ的一些示例。

请注意,如果您愿意,可以更改这些前缀。但我会建议你保留这些默认值,除非你真的知道你在做什么。

答案 1 :(得分:2)

上面的答案中没有提到更大,更重要的区别。

主题是自动删除的,而队列是持久的。这意味着当websocket连接关闭时,主题及其数据将被删除。在队列中,服务器仍然可以发送消息,并且当客户端通过websocket连接时,它会接收服务器发送的旧消息。

顺便说一句,内存代理没有什么区别。使用专用经纪人时会发生这种情况。

答案 2 :(得分:1)

我认为该主题的最佳答案将来自Spring Docs

  

目的地的含义在STOMP中故意保持不透明   规范。 它可以是任何字符串,它完全取决于STOMP服务器   定义它们的目的语义和语法   支持。 然而,目标是路径般的很常见   字符串,其中“/ topic / ..”表示发布 - 订阅(一对多)和   “/ q​​ueue /”表示点对点(一对一)消息交换。