4

SUBSCRIBE リクエストを受け入れる Spring Websocket Stomp アプリケーションがあります。

アプリケーションには、SUBSCRIBE のハンドラーがあります。つまり、

 @Component
 public class SubscribeStompEventHandler implements ApplicationListener<SessionSubscribeEvent> {

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

サブスクリプションを検証するために使用します。

onApplicationEventで何かをチェックし、この関数から STOMP ERROR メッセージをクライアントに送り返します。

このレシピを見つけましたSpring WebSocketでエラーメッセージをSTOMPクライアントに送信する方法は? しかし、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 を送信したときに function(error) を呼び出すことです。

Outboundchannel を取得するなどして、適切な STOMP ERROR を正確に送信する方法を教えてください。

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;

beanclientOutboundChannelが で宣言されているから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 に答える