如果我使用的是“简单代理”,那么Spring + SockJS的/topic、/queue等有什么区别吗?这里说的是:当客户端订阅一个以/user/开头的通道,例如:/user/ 在上向特定用户发送消息 /,您的服务器实例将订阅一个名为queue /reply-user会话id的队列。
我想从某种程度上理解这种转变背后的逻辑。
发布于 2016-06-16 15:05:05
你应该看看参考文件的这一部分。简而言之,"/topic"和"/queue"都是配置到同一个目的地的前缀。
在文档中,"/app"是配置好的“应用程序目的地前缀”--意思是所有通过"clientInboundChannel"流入并匹配这些前缀的消息都将映射到您的应用程序,例如使用@MessageMapping注释。
在这里,"/topic"和"/queue"都是配置为STOMP目的地的前缀--这意味着所有流经"clientInboundChannel"并匹配这些前缀的消息都将被转发给STOMP。在您的例子中,这是简单的代理实现。
因此,从Spring的角度来看,"/queue"和"/topic"被以同样的方式对待,并且是“典型的”STOMP目的地--所有匹配它们的消息都被转发到messages。现在,如果您使用的是完整的message实现,那么这些目的地可能没有相同的含义,而且message的行为可能会有所不同。下面是使用阿波罗和RabbitMQ的一些示例。
注意,如果您愿意,可以更改这些前缀。但我建议你保留这些默认值,除非你真的知道你在做什么。
发布于 2020-04-27 09:28:06
有一个更大和更重要的差异,没有在上面提到的答案。
主题是自动删除,而队列是持久的。这意味着当websocket连接关闭时,主题及其数据将被删除。在队列中,服务器仍然可以发送消息,当客户端通过websocket连接时,它通过服务器接收旧的发送消息。
顺便说一句,内存代理没有什么区别。在使用专用代理时会发生这种情况。
发布于 2018-05-08 18:11:39
我认为最好的答案是Spring中的以下内容
目的地的含义有意在STOMP规范中不透明。可以是任何字符串,完全由STOMP服务器来定义它们支持的目的地的语义和语法。--但是,目的地通常是路径式字符串,其中“/topic/.”意味着发布-订阅(一对多)和"/queue/“意味着点对点(一对一)的消息交换。
https://stackoverflow.com/questions/37853810
复制相似问题