@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命令,其中有SUBSCRIBE
和SEND
。
用 @SubscribeMapping("/topic/topic1")
注释的方法将仅接收 SUBSCRIBE
条目标为 "/topic/topic1"
的消息。 IE。当client订阅主题"/topic/topic1"
时,会调用该方法。
相反,客户端向"/topic/topic1"
目的地发送SEND
消息时,不会调用此方法。
将调用带有 @MessageMapping("/topic2")
注释的方法以将 SEND
消息发送到 "/app/topic2"
目的地,默认情况下,会将结果发送到目的地 "/topic/topic2"
.
逻辑是客户端首先CONNECT
s,然后SUBSCRIBE
s到一些主题,并接收服务器(或其他客户端)发送到这些主题的消息。它也可能 SEND
某些主题的一些消息。然后它可能 UNSUBSCRIBE
和 DISCONNECT
。消息交换过程由消息代理管理,消息代理可以是简单的内存对象或一些高级产品,如 ActiveMQ
或 RabbitMQ
等
当使用带有 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命令,其中有SUBSCRIBE
和SEND
。
用 @SubscribeMapping("/topic/topic1")
注释的方法将仅接收 SUBSCRIBE
条目标为 "/topic/topic1"
的消息。 IE。当client订阅主题"/topic/topic1"
时,会调用该方法。
相反,客户端向"/topic/topic1"
目的地发送SEND
消息时,不会调用此方法。
将调用带有 @MessageMapping("/topic2")
注释的方法以将 SEND
消息发送到 "/app/topic2"
目的地,默认情况下,会将结果发送到目的地 "/topic/topic2"
.
逻辑是客户端首先CONNECT
s,然后SUBSCRIBE
s到一些主题,并接收服务器(或其他客户端)发送到这些主题的消息。它也可能 SEND
某些主题的一些消息。然后它可能 UNSUBSCRIBE
和 DISCONNECT
。消息交换过程由消息代理管理,消息代理可以是简单的内存对象或一些高级产品,如 ActiveMQ
或 RabbitMQ
等