WebSocket STOMP协议服务端给客户端发送ERROR帧
第一种:手动主装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 {@Overridepublic Message<byte[]> handleClientMessageProcessingError(Message<byte[]> clientMessage, Throwable ex) {// 创建ERROR帧的头部信息StompHeaderAccessor errorAccessor = StompHeaderAccessor.create(StompCommand.ERROR);// 设置错误信息errorAccessor.setMessage(ex.getMessage());// 设置会话IDStompHeaderAccessor clientAccessor = StompHeaderAccessor.wrap(clientMessage);errorAccessor.setSessionId(clientAccessor.getSessionId());// 保留其他必要的头部信息errorAccessor.setLeaveMutable(true);// 创建并返回ERROR帧消息return MessageBuilder.createMessage(new byte[0], errorAccessor.getMessageHeaders());}
}
将自定义的这个在配置中注入
// 注册自定义错误处理器@Beanpublic CustomStompErrorHandler customStompErrorHandler() {return new CustomStompErrorHandler();}
第二种:直接抛出MessageDeliveryException这个异常,Spring框架会自己去找StompSubProtocolErrorHandler然后处理
throw new MessageDeliveryException("直接抛出");