使用简单代理时,Spring Websocket + SockJS中的/topic、/queue等之间有什么区别?比如在这里Sending message to specific user on Spring Websocket中,有这样一段话:当您的客户端订阅以/user/开头的频道时,例如:/user/queue/reply,您的服务器实例将订阅一个名为queue/reply-user[session id]的队列。我想以一种清晰的方式理解这些转换背后的逻辑。
你应该查看参考文档中的这部分内容。
简而言之,"/topic"
和"/queue"
是配置到相同目标的前缀。
在文档中,"/app"
是配置的“应用程序目标前缀”- 意思是通过"clientInboundChannel"
流入且匹配这些前缀的所有消息都将映射到您的应用程序,例如使用@MessageMapping
注解。
在这里,"/topic"
和"/queue"
也是配置为STOMP目标的前缀- 意味着通过"clientInboundChannel"
流入且匹配这些前缀的所有消息都将转发到STOMP代理。对于你的情况,那是简单代理实现。
因此,从Spring Websocket的角度来看,"/queue"
和"/topic"
被视为相同并且是“典型”的STOMP目标- 所有匹配它们的消息都将被转发到消息代理。现在,如果你正在使用完整的消息代理实现,这些目标可能不具有相同的含义,消息代理的行为可能不同。以下是使用Apache Apollo和RabbitMQ的一些示例。
请注意,如果您愿意,可以更改这些前缀。但我建议你保持这些默认值,除非你确实知道你在做什么。
以上回答中没有提到更重要的区别,即主题(Topic)是自动删除的,而队列(Queue)是持久化的。这意味着当 WebSocket 连接关闭时,主题及其数据将被删除。在队列中,服务器仍然可以发送消息,并且当客户端通过 WebSocket 连接时,它会接收到服务器先前发送的消息。
另外,在内存代理中没有区别。这种情况发生在使用专用代理时。