簡體   English   中英

Spring Websocket踐踏客戶端如何捕獲丟失的連接?

[英]Spring websocket stomp client how to capture the connection is lost?

我使用spring websocket踩踏客戶端。 下面是一個代碼片段:

List<Transport> transports = new ArrayList<Transport>(2);
transports.add(new WebSocketTransport(new StandardWebSocketClient()));
transports.add(new RestTemplateXhrTransport());

WebSocketHttpHeaders headers = new WebSocketHttpHeaders();
headers.add("Cookie", client.getCookieString());

SockJsClient sockJsClient = new SockJsClient(transports);

WebSocketStompClient stompClient = new WebSocketStompClient(sockJsClient);
stompClient.setMessageConverter(new StringMessageConverter());
ListenableFuture<StompSession> future = 
   stompClient.connect(configuration.getApp().getWebsocketServerBase() + "/websocket/sa", headers, new MyWebSocketHandler());

future.addCallback(new SuccessCallback<StompSession>() {
    public void onSuccess(StompSession stompSession) {
        System.out.println("on Success!");
    }
}, new FailureCallback() {
    public void onFailure(Throwable throwable) {
        System.out.println("on Failure!");
    }
});

它可以工作,但是當websocket服務器關閉時,客戶端不會收到該消息。

如何監聽服務器關閉事件?

我找到了解決方案。

MyWebSocketHandler這樣實現StompSessionHandler:

private class MyWebSocketHandler implements StompSessionHandler {
    @Override
    public void afterConnected(StompSession stompSession, StompHeaders stompHeaders) {

    }

    @Override
    public void handleException(StompSession stompSession, StompCommand stompCommand, StompHeaders stompHeaders, byte[] bytes, Throwable throwable) {
    }

    @Override
    public void handleTransportError(StompSession stompSession, Throwable throwable) {
        if (throwable instanceof ConnectionLostException) {
            // if connection lost, call this
        }
    }

    @Override
    public Type getPayloadType(StompHeaders stompHeaders) {
        return null;
    }

    @Override
    public void handleFrame(StompHeaders stompHeaders, Object o) {
    }
}

您可以看到方法handleTransportError。 謝謝。

參考Spring WebSocket文檔 25.4.13 STOMP客戶端。

我認為您也可以捕獲SessionDisconnectEvent

SessionDisconnectEvent —在STOMP會話結束時發布。 DISCONNECT可能已經從客戶端發送,或者在關閉WebSocket會話時也可能自動生成。 在某些情況下,每個會話可能多次發布此事件。 關於多個斷開事件,組件應該是冪等的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM