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

Ask*_*mov 10 java spring stomp sockjs spring-websocket

有没有澄清,如果我使用"简单代理",Spring Websocket + SockJS的/ topic,/ queue等之间有什么区别?例如,这里向Spring Websocket上的特定用户发送消息:当您的客户端订阅以/ user /开头的频道时,例如:/ user/queue/reply,您的服务器实例将订阅名为queue/reply-user的队列[会话ID]

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

Bri*_*zel 12

您应该看一下参考文档的这一部分.概括地说,"/topic"和"/queue"是被配置到同一目的地的两个前缀.

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

这里也是,"/topic"并且"/queue"都是配置为STOMP目的地的前缀 - 意味着通过"clientInboundChannel"并匹配这些前缀的所有消息将被转发到STOMP代理.在您的情况下,这是简单的代理实现.

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

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

  • 您能否评论一下 /topic 和 /queue 之间的实际区别是什么?现在还不清楚我应该使用它们中的任何一个还是可以自己制作。 (2认同)

cle*_*pqz 6

我认为该主题的最佳答案是 Spring Docs 中的以下内容

在 STOMP 规范中,目的地的含义故意不透明。它可以是任何 string,完全由 STOMP 服务器来定义它们支持的目的地的语义和语法。然而,目的地是类似路径的字符串是很常见的,其中“/topic/..”意味着发布-订阅(一对多),而“/queue/”意味着点对点(一对多) -一)消息交换。


den*_*izg 6

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

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

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