Spring boot @订阅映射vs@MessageMapping

Spring boot @订阅映射vs@MessageMapping,spring-boot,websocket,spring-websocket,stomp,Spring Boot,Websocket,Spring Websocket,Stomp,在将WebSocket与Spring Boot一起使用时,我看到了使用以下内容的示例: @Configuration @EnableWebSocketMessageBroker public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer { @Override public void configureMessageBroker(MessageBrokerRegistry con

在将WebSocket与Spring Boot一起使用时,我看到了使用以下内容的示例:

@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");;
     }  
} 
使用@MessageMapping注释在控制器中指定config.setApplicationDestinationPrefixes(“/app”)和

我还看到了一些只使用enableSimpleBroker()的示例,并且在控制器中使用@SubscribeMapping

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

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


有什么区别吗?

简短回答

@MessageMapping
-带注释的方法将仅对目标具有前缀
/app
且与注释中设置的主题匹配的
发送
消息作出反应

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

更长的答案

客户端可以发送几种类型的STOMP命令,其中包括
SUBSCRIBE
send

@SubscribeMapping(“/topic/topic1”)
注释的方法将只接收目标为
“/topic/topic1”的
SUBSCRIBE
消息。即,当客户端订阅主题
“/topic/topic1”
时,将调用此方法

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

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

其逻辑是,客户端首先
连接
s,然后
订阅
s某些主题,并接收服务器(或其他客户端)发送给这些主题的消息。它还可以
向某些主题发送
一些消息。然后它可以
取消订阅
断开
。消息交换过程由消息代理管理,它可以是一个简单的内存对象,也可以是一些高级产品,如
ActiveMQ
RabbitMQ