WebSocket STOMP协议服务端给客户端发送ERROR帧

发布于:2025-09-03 ⋅ 阅读:(21) ⋅ 点赞:(0)

第一种:手动主装ERROR帧发送

import org.springframework.messaging.Message;
import org.springframework.messaging.MessageHeaders;
import org.springframework.messaging.simp.stomp.StompCommand;
import org.springframework.messaging.simp.stomp.StompHeaderAccessor;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.web.socket.messaging.StompSubProtocolErrorHandler;

public class CustomStompErrorHandler extends StompSubProtocolErrorHandler {

    @Override
    public Message<byte[]> handleClientMessageProcessingError(Message<byte[]> clientMessage, Throwable ex) {
        // 创建ERROR帧的头部信息
        StompHeaderAccessor errorAccessor = StompHeaderAccessor.create(StompCommand.ERROR);
        
        // 设置错误信息
        errorAccessor.setMessage(ex.getMessage());
        
        // 设置会话ID
        StompHeaderAccessor clientAccessor = StompHeaderAccessor.wrap(clientMessage);
        errorAccessor.setSessionId(clientAccessor.getSessionId());
        
        // 保留其他必要的头部信息
        errorAccessor.setLeaveMutable(true);
        
        // 创建并返回ERROR帧消息
        return MessageBuilder.createMessage(new byte[0], errorAccessor.getMessageHeaders());
    }
}

将自定义的这个在配置中注入

// 注册自定义错误处理器
    @Bean
    public CustomStompErrorHandler customStompErrorHandler() {
        return new CustomStompErrorHandler();
    }
    

第二种:直接抛出MessageDeliveryException这个异常,Spring框架会自己去找StompSubProtocolErrorHandler然后处理

 throw new MessageDeliveryException("直接抛出");


网站公告

今日签到

点亮在社区的每一天
去签到