从 Spring Websocket 程序发送 STOMP ERROR
Send STOMP ERROR from Spring Websocket program
我有一个接受 SUBSCRIBE 请求的 Spring Websocket Stomp 应用程序。
在应用程序中,我有一个 SUBSCRIBE 处理程序,即
@Component
public class SubscribeStompEventHandler implements ApplicationListener<SessionSubscribeEvent> {
@Override
public void onApplicationEvent(SessionSubscribeEvent event) {}
}
我用来验证订阅。
我会在 onApplicationEvent 中检查一些内容,然后从该函数将 STOMP ERROR 消息发送回客户端。
我找到了这个食谱 但我需要了解如何获取 outboundChannel。
我还尝试了以下代码:
public void sendStompError(SimpMessagingTemplate simpMessagingTemplate, String sessionId, String topic, String errorMessage) {
StompHeaderAccessor headerAccessor = StompHeaderAccessor.create(StompCommand.ERROR);
headerAccessor.setMessage(errorMessage);
headerAccessor.setSessionId(sessionId);
headerAccessor.setLeaveMutable(true);
simpMessagingTemplate.convertAndSendToUser(sessionId, topic, new byte[0], headerAccessor.getMessageHeaders());
}
我尝试将主题设为某个订阅主题和 /queue/error 主题。但是我没有看到消息传播到客户端。
在客户端,我使用:
stompClient.connect(headers
, function (frame) {
console.log("Conn OK " + url);
}, function (error) {
console.log("Conn NOT OK " + url + ": " + JSON.stringify(error));
});
}
我的目标是在发送 STOMP ERROR 时调用函数(错误)。
请告诉我如何发送正确的 STOMP ERROR,例如通过获取出站通道。
您可以像这样发送 ERROR
消息:
StompHeaderAccessor headerAccessor = StompHeaderAccessor.create(StompCommand.ERROR);
headerAccessor.setMessage(error.getMessage());
headerAccessor.setSessionId(sessionId);
this.clientOutboundChannel.send(MessageBuilder.createMessage(new byte[0], headerAccessor.getMessageHeaders()));
以下足以注入 clientOutboundChannel
:
@Autowired
@Qualifier("clientOutboundChannel")
private MessageChannel clientOutboundChannel;
只是因为 clientOutboundChannel
bean 声明在 AbstractMessageBrokerConfiguration
.
更新
STOMP ERROR always closes connection? I am getting this effect. Code 1002.
是的,是的。见 StompSubProtocolHandler.sendToClient()
:
if (StompCommand.ERROR.equals(command)) {
try {
session.close(CloseStatus.PROTOCOL_ERROR);
}
catch (IOException ex) {
// Ignore
}
}
我有一个接受 SUBSCRIBE 请求的 Spring Websocket Stomp 应用程序。
在应用程序中,我有一个 SUBSCRIBE 处理程序,即
@Component
public class SubscribeStompEventHandler implements ApplicationListener<SessionSubscribeEvent> {
@Override
public void onApplicationEvent(SessionSubscribeEvent event) {}
}
我用来验证订阅。
我会在 onApplicationEvent 中检查一些内容,然后从该函数将 STOMP ERROR 消息发送回客户端。
我找到了这个食谱
我还尝试了以下代码:
public void sendStompError(SimpMessagingTemplate simpMessagingTemplate, String sessionId, String topic, String errorMessage) {
StompHeaderAccessor headerAccessor = StompHeaderAccessor.create(StompCommand.ERROR);
headerAccessor.setMessage(errorMessage);
headerAccessor.setSessionId(sessionId);
headerAccessor.setLeaveMutable(true);
simpMessagingTemplate.convertAndSendToUser(sessionId, topic, new byte[0], headerAccessor.getMessageHeaders());
}
我尝试将主题设为某个订阅主题和 /queue/error 主题。但是我没有看到消息传播到客户端。
在客户端,我使用:
stompClient.connect(headers
, function (frame) {
console.log("Conn OK " + url);
}, function (error) {
console.log("Conn NOT OK " + url + ": " + JSON.stringify(error));
});
}
我的目标是在发送 STOMP ERROR 时调用函数(错误)。
请告诉我如何发送正确的 STOMP ERROR,例如通过获取出站通道。
您可以像这样发送 ERROR
消息:
StompHeaderAccessor headerAccessor = StompHeaderAccessor.create(StompCommand.ERROR);
headerAccessor.setMessage(error.getMessage());
headerAccessor.setSessionId(sessionId);
this.clientOutboundChannel.send(MessageBuilder.createMessage(new byte[0], headerAccessor.getMessageHeaders()));
以下足以注入 clientOutboundChannel
:
@Autowired
@Qualifier("clientOutboundChannel")
private MessageChannel clientOutboundChannel;
只是因为 clientOutboundChannel
bean 声明在 AbstractMessageBrokerConfiguration
.
更新
STOMP ERROR always closes connection? I am getting this effect. Code 1002.
是的,是的。见 StompSubProtocolHandler.sendToClient()
:
if (StompCommand.ERROR.equals(command)) {
try {
session.close(CloseStatus.PROTOCOL_ERROR);
}
catch (IOException ex) {
// Ignore
}
}