/topic, /queue for SimpleMessageBroker in Spring Websocket + SockJS 的区别

2022-09-03 00:52:35

有没有一个澄清,如果我使用“简单代理”,Spring Websocket + SockJS的/topic,/queue等有什么区别?例如,这里在Spring Websocket上向特定用户发送消息,据说:当您的客户端订阅以/user/开头的通道时,例如:/user/queue/reply,您的服务器实例将订阅一个名为queet/reply-user[session id]的队列。

我想以某种清晰的方式理解这种转换背后的逻辑。


答案 1

您应该查看参考文档的这一部分。简而言之,并且两者都配置为同一目标。"/topic""/queue"

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

这里也是,并且两个前缀都配置为 STOMP 目标 - 这意味着所有流入并匹配这些前缀的消息都将转发到 STOMP 代理。在你的例子中,这是简单的代理实现。"/topic""/queue""clientInboundChannel"

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

请注意,如果需要,可以更改这些前缀。但我建议你把它们作为默认值,除非你真的知道你在做什么。


答案 2

我认为这个话题的最佳答案是Spring Docs的以下内容

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


推荐