@SubscribeMapping与@MessageMapping的区别

7

在使用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");;
     }  
} 

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

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

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

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

它们的区别是什么?

1个回答

14

简短回答

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

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

详细回答

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

使用@SubscribeMapping("/topic/topic1")注释的方法仅接收目标为"/topic/topic1"SUBSCRIBE消息。也就是说,当客户端订阅主题"/topic/topic1"时,该方法将被调用。

相反,如果客户端向"/topic/topic1"目标发送SEND消息,则不会调用该方法。

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接