4

我有一个接受订阅请求的 Spring Websocket Stomp 应用程序。

在应用程序中,我有一个 SUBSCRIBE 处理程序,即

 @Component
 public class SubscribeStompEventHandler implements ApplicationListener<SessionSubscribeEvent> {

    @Override
    public void onApplicationEvent(SessionSubscribeEvent event) {}
 }

我用来验证订阅。

我会检查onApplicationEvent中的某些内容并将 STOMP ERROR 消息从该函数发送回客户端。

我找到了这个食谱How to send ERROR message to STOMP clients with Spring WebSocket? 但我需要了解如何获取 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,例如通过获取 Outboundchannel。

4

1 回答 1

14

您可以像这样发送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;

仅仅因为clientOutboundChannelbean 在AbstractMessageBrokerConfiguration.

更新

STOMP ERROR 总是关闭连接?我得到了这个效果。代码 1002。

是的。见StompSubProtocolHandler.sendToClient()

       if (StompCommand.ERROR.equals(command)) {
            try {
                session.close(CloseStatus.PROTOCOL_ERROR);
            }
            catch (IOException ex) {
                // Ignore
            }
        }
于 2016-09-22T14:22:03.473 回答