@@ SubscribeMapping vs @MessageMapping

问题描述 投票:2回答:1

[在Spring Boot中使用websocket时,我已经看到了使用以下示例:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

     @Override
     public void configureMessageBroker(MessageBrokerRegistry config) {
      config.enableSimpleBroker("/topic/");
      config.setApplicationDestinationPrefixes("/app");
     }

     @Override
     public void registerStompEndpoints(StompEndpointRegistry registry) {
      registry.addEndpoint("/greeting");;
     }  
} 

指定config.setApplicationDestinationPrefixes(“ / app”)并在控制器中使用@MessageMapping注释。

而且我还看到了仅使用enableSimpleBroker()并且在控制器中使用@SubscribeMapping的示例。

据我所知,@ MessageMapping负责将收到的消息路由到正确的方法。并且只有在目标包含setApplicationDestinationPrefixes中声明的前缀之一时,才会触发带有此注释的方法。

但是@SubscribeMapping也将消息路由到正确的方法,我们不需要在config类中调用setApplicationDestinationPrefixes()。

有什么区别?

spring-boot websocket spring-websocket stomp
1个回答
1
投票

简短回答

[@MessageMapping]注释的方法将只对目的地为前缀SEND且与注释中设置的主题匹配的/app消息作出反应。

[@SubscribeMapping]注释的方法将仅对目标与注释中设置的主题匹配的SUBSCRIBE消息作出反应。

更长的答案

客户端可以发送几种STOMP命令,其中有SUBSCRIBESEND

注有@SubscribeMapping("/topic/topic1")的方法将仅接收带有目的地SUBSCRIBE"/topic/topic1"消息。即当客户订阅主题"/topic/topic1"时,将调用此方法。

相反,当客户端将SEND消息发送到"/topic/topic1"目的地时,将不会调用此方法。

发送到@MessageMapping("/topic2")目标的SEND消息将调用带有"/app/topic2"注释的方法,默认情况下,将结果发送到目标"/topic/topic2"

逻辑是,客户端首先进入CONNECT,然后进入SUBSCRIBE进入某些主题,并接收服务器(或其他客户端)发送给这些主题的消息。它还可能会SEND某些主题的消息。然后可能是UNSUBSCRIBEDISCONNECT。消息交换的过程由消息代理管理,消息代理可以是简单的内存对象或某些高级产品,例如ActiveMQRabbitMQ等。

© www.soinside.com 2019 - 2024. All rights reserved.