@SubscribeMapping 与 @MessageMapping

Pau*_*ira 2 stomp websocket spring-boot spring-websocket

在 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");;
     }  
} 
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

有什么不同?

Sta*_*nov 6

简答

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

@SubscribeMapping-annotated 方法将仅对SUBSCRIBE目的地与注释中设置的主题相匹配的消息做出反应。

更长的答案

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

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

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

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

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