Spring Websocket+SockJS中SimpleMessageBroker的/topic和/queue之间的java差异
如果我使用“简单代理”,Spring Websocket+SockJS的/topic、/queue等之间有什么区别?例如,这里Sending message to specific user on Spring Websocket据说:当您的客户端订阅以/user/开头的频道时,例如:/user/queue/reply,您的服务器实例将订阅名为queue/reply user[session id]
我想以某种清晰的方式理解这种转换背后的逻辑
# 1 楼答案
你应该看看this part of the reference documentation。 简而言之,
"/topic"
和"/queue"
都是为同一目的地配置的前缀在文档中,
"/app"
是配置的“应用程序目标前缀”——这意味着通过"clientInboundChannel"
流入的所有消息,并且匹配这些前缀的消息将被映射到您的应用程序,例如带有@MessageMapping
注释这里,
"/topic"
和"/queue"
都是配置为STOMP目的地的前缀——这意味着所有通过"clientInboundChannel"
流入并匹配这些前缀的消息都将转发到STOMP代理。在您的例子中,这就是简单的代理实现因此,从Spring Websocket的角度来看,
"/queue"
和"/topic"
被以同样的方式对待,是“典型的”STOMP目的地——所有与之匹配的消息都被转发到messages broker。现在,如果您使用的是完整的message broker实现,那么这些目的地可能没有相同的含义,message broker的行为也可能不同。下面是一些Apache Apollo和RabbitMQ的例子请注意,如果愿意,可以更改这些前缀。但我建议你保留默认值,除非你真的知道自己在做什么
# 2 楼答案
上面的答案中没有提到一个更大、更重要的区别
主题是自动删除,而队列是持久的。这意味着当websocket连接关闭时,主题及其数据将被删除。在队列中,服务器仍然可以发送消息,当客户端通过websocket连接时,它会接收服务器发送的旧消息
顺便说一句,内存代理没有区别。使用专用代理时会发生这种情况