@SubscribeMapping 与 @MessageMapping

@SubscribeMapping vs @MessageMapping

当使用带有 Spring Boot 的 websockets 时,我看到了使用的示例:

@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 也会将消息路由到正确的方法,我们不需要在配置中调用 setApplicationDestinationPrefixes() class。

有什么区别?

简答

@MessageMapping- 注释方法将仅对 SEND 消息作出反应,目标具有前缀 /app 并匹配注释中设置的主题。

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

更长的答案

客户端可以发送多种类型的STOMP命令,其中有SUBSCRIBESEND

@SubscribeMapping("/topic/topic1") 注释的方法将仅接收 SUBSCRIBE 条目标为 "/topic/topic1" 的消息。 IE。当client订阅主题"/topic/topic1"时,会调用该方法。

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

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

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