[在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()。
有什么区别?
简短回答
[@MessageMapping
]注释的方法将只对目的地为前缀SEND
且与注释中设置的主题匹配的/app
消息作出反应。
[@SubscribeMapping
]注释的方法将仅对目标与注释中设置的主题匹配的SUBSCRIBE
消息作出反应。
更长的答案
客户端可以发送几种STOMP命令,其中有SUBSCRIBE
和SEND
。
注有@SubscribeMapping("/topic/topic1")
的方法将仅接收带有目的地SUBSCRIBE
的"/topic/topic1"
消息。即当客户订阅主题"/topic/topic1"
时,将调用此方法。
相反,当客户端将SEND
消息发送到"/topic/topic1"
目的地时,将不会调用此方法。
发送到@MessageMapping("/topic2")
目标的SEND
消息将调用带有"/app/topic2"
注释的方法,默认情况下,将结果发送到目标"/topic/topic2"
。
逻辑是,客户端首先进入CONNECT
,然后进入SUBSCRIBE
进入某些主题,并接收服务器(或其他客户端)发送给这些主题的消息。它还可能会SEND
某些主题的消息。然后可能是UNSUBSCRIBE
和DISCONNECT
。消息交换的过程由消息代理管理,消息代理可以是简单的内存对象或某些高级产品,例如ActiveMQ
或RabbitMQ
等。