要保持Spring WebSocket连接的活跃状态,可以使用心跳机制。下面是一个示例代码,演示了如何在Spring WebSocket中实现心跳:
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic");
config.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/websocket").withSockJS();
}
@Override
public void configureWebSocketTransport(WebSocketTransportRegistration registration) {
registration.addDecoratorFactory(webSocketHandlerDecoratorFactory());
}
@Bean
public WebSocketHandlerDecoratorFactory webSocketHandlerDecoratorFactory() {
return new WebSocketHandlerDecoratorFactory() {
@Override
public WebSocketHandler decorate(WebSocketHandler handler) {
return new CustomWebSocketHandler(handler);
}
};
}
}
public class CustomWebSocketHandler extends WebSocketHandlerDecorator {
private static final long HEARTBEAT_INTERVAL = 5000; // 心跳间隔时间,单位为毫秒
public CustomWebSocketHandler(WebSocketHandler delegate) {
super(delegate);
}
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
super.afterConnectionEstablished(session);
startHeartbeat(session);
}
@Override
public void handleMessage(WebSocketSession session, WebSocketMessage> message) throws Exception {
// 处理收到的消息
super.handleMessage(session, message);
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {
super.afterConnectionClosed(session, closeStatus);
stopHeartbeat(session);
}
private void startHeartbeat(WebSocketSession session) {
ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
executor.scheduleAtFixedRate(() -> {
try {
session.sendMessage(new TextMessage("heartbeat")); // 发送心跳消息
} catch (IOException e) {
e.printStackTrace();
}
}, HEARTBEAT_INTERVAL, HEARTBEAT_INTERVAL, TimeUnit.MILLISECONDS);
session.getAttributes().put("executor", executor);
}
private void stopHeartbeat(WebSocketSession session) {
ScheduledExecutorService executor = (ScheduledExecutorService) session.getAttributes().get("executor");
executor.shutdown();
}
}
@Controller
public class WebSocketController {
@MessageMapping("/hello")
@SendTo("/topic/greetings")
public String greeting(String message) throws Exception {
return "Hello, " + message + "!";
}
}
通过以上的代码,你可以实现Spring WebSocket的心跳机制,保持连接的活跃状态。