面试题答案
一键面试配置WebSocket连接端点
- 创建配置类:
创建一个继承自
WebSocketConfigurer
的配置类,例如WebSocketConfig
。在Spring Boot中,可使用@Configuration
注解标记该类,表明这是一个配置类。
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
// 配置消息代理前缀,客户端发送消息到带有该前缀的目的地,服务端会将其转发到对应的消息代理
config.setApplicationDestinationPrefixes("/app");
// 配置订阅前缀,服务端发送消息到带有该前缀的目的地,客户端可订阅这些目的地接收消息
config.enableSimpleBroker("/topic", "/queue");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
// 注册STOMP协议的端点,客户端通过这个端点连接WebSocket
registry.addEndpoint("/websocket-endpoint").withSockJS();
}
}
-
@EnableWebSocketMessageBroker
注解: 启用WebSocket消息代理功能,使得应用程序能够处理基于STOMP协议的WebSocket消息。 -
registerStompEndpoints
方法:
addEndpoint
方法用于添加WebSocket端点。这里/websocket - endpoint
是自定义的端点路径,客户端将通过这个路径连接到WebSocket服务。.withSockJS()
表示为该端点启用SockJS fallback机制。SockJS是一个JavaScript库,它提供了跨浏览器的WebSocket通信抽象,当浏览器不支持原生WebSocket时,SockJS会自动降级使用其他技术(如XHR流、JSONP轮询等)来模拟WebSocket的功能,以确保实时通信的兼容性。
消息处理机制
- 创建消息处理类:
创建一个带有
@Controller
注解的类来处理接收到的消息,例如WebSocketController
。
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Controller;
@Controller
public class WebSocketController {
@MessageMapping("/hello")
@SendTo("/topic/greetings")
public String handleHelloMessage(String message) {
return "Hello, " + message + "!";
}
}
-
@MessageMapping
注解: 类似于Spring MVC中的@RequestMapping
,用于映射WebSocket消息的目的地。这里/hello
是消息的目的地,当客户端向/app/hello
(/app
是之前配置的应用程序目的地前缀)发送消息时,handleHelloMessage
方法将被调用。 -
@SendTo
注解: 指定消息处理方法处理完消息后,将返回值发送到的目的地。这里/topic/greetings
表示处理后的消息将被发送到以/topic/greetings
为目的地的订阅者(客户端通过订阅/topic/greetings
来接收该消息)。 -
消息代理转发: Spring Boot通过消息代理来转发消息。当客户端发送消息到带有
/app
前缀的目的地时,Spring会查找对应的@MessageMapping
注解的方法来处理消息。处理完成后,若有@SendTo
注解,消息会被发送到指定的目的地,由消息代理转发给订阅该目的地的客户端。如果消息是发送到/topic
或/queue
前缀的目的地,消息代理会直接将消息转发给相应的订阅者。