第一种:手动主装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("直接抛出");