переподключиться после OnWebSocketClose - причал 9.4

Согласно этому сообщению [Когда срабатывает OnWebSocketClose в Jetty 9, OnClose огонь для меня правильно. но я не могу переподключиться, потому что у меня не правильная ситуация. (websocett закрыт и я не могу отправить сообщение)

где и когда я могу переподключиться при проблеме с веб-сокетом (закрыть из-за проблемы с сетью или тайм-аута или отключения через n секунд без рукопожатия)


person Alireza    schedule 21.05.2017    source источник


Ответы (1)


Я не уверен, что вы решили эту проблему, но мне удалось найти решение для повторного подключения соединения WebSocket.

Для моего сценария я хотел бы повторно подключить свое соединение WebSocket, если срабатывает метод @OnWebSocketError. Изначально я реализовал это так

Реализация А:

@OnWebSocketError
public void onError(Throwable e) {
    someMethodToReconnect();
}

и внутри someMethodToReconnect

if (client == null) {
    client = new WebSocketClient(sslContextFactory);
    client.setMaxIdleTimeout(0);
}

if (socket == null) {
    socket = new ReaderSocket();  // ReaderSocket is the name of my @WebSocket class
}

try {
    client.start();
    client.connect(socket, new URI(socketUrl), request);
} catch (Exception e) {
    LOGGER.error("Unable to connect to WebSocket: ", e);
}

Однако это привело к другой проблеме. Мне возвращают 2 типа ошибок, если сервер не работает. Исключения составляют java.net.ConnectException и org.eclipse.jetty.websocket.api.UpgradeException.

Поток будет:

  1. Первоначальный запрос к серверу WebSocket (сервер не работает)
  2. java.net.ConnectException бросил
  3. org.eclipse.jetty.websocket.api.UpgradeException бросил

А в реализации A someMethodToReconnect будет вызываться дважды.

Это привело к реализации B.

@OnWebSocketError
public void onError(Throwable e) {
    if (e instanceof ConnectException) {
        // Attempt to reconnect
        someMethodToReconnect();
    } else {
        // Ignore upgrade exception
    }
}

Пока Реализация B работает нормально, однако я пытаюсь выяснить, есть ли какие-либо другие исключения, которые могут быть вызваны.

person Vantablack    schedule 20.07.2017
comment
Это точно отразило то, что происходило в моем коде. При реализации вашего решения мои повторные подключения происходят отлично. - person phomlish; 16.11.2018
comment
ВНИМАНИЕ: наш код уже работал, поэтому можно скрыть настоящие исключения обновления. Но если вы ошибетесь в request.setSubProtocols (как я сделал, когда впервые программировал таким образом), это скроет ваши проблемы. Кроме того, я делаю гораздо больше журналов обработки исключений на случай, если что-то когда-нибудь начнет вызывать вещи, которых я не ожидаю. - person phomlish; 16.11.2018
comment
Можете показать весь код? Судя по тому, что я вижу, ваш someMethodToReconnect существует внутри ReaderSocket. - person Karlson; 13.02.2020