2017-05-21 16 views

답변

0

(핸드 쉐이크없이 n 초 후 가까운 네트워크 문제 또는 단절에 의한 제한 또는 킥아웃에 의해) 웹 소켓 문제에 다시 연결할 수 있습니다 때 나는 아니에요 이 문제를 해결했다면 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); 
} 

내부 : 처음에 나는이

구현처럼 구현했습니다. 서버가이 아닌 경우 의 두 가지 유형의 오류가 다시 발생합니다. 예외는 java.net.ConnectExceptionorg.eclipse.jetty.websocket.api.UpgradeException입니다.

흐름은 다음과 같습니다

  1. 웹 소켓 서버에 초기 요청 (서버가 아닌)
  2. java.net.ConnectException
  3. org.eclipse.jetty.websocket.api.UpgradeException

을 던져 그리고 구현, someMethodToReconnect을에를 던져 두 번 부름 받았다.

그러나 내가 던져 질 것이다 다른 예외가 있는지 알아 내기 위해 노력하고있어, 잘 작동
구현 B

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

지금까지 구현 B되었다. 여기

java.util.concurrent.RejectedExecutionException: Max requests per destination 1024 exceeded for HttpDestination 

내 솔루션입니다 : 스레드를 생성하기 전에 연결 :

1

@Vantablack, 실제로 우리의 OnError 콜백 메소드에 다시 연결 할 수 없어, 그것은 예외가 발생할 수

new Thread(new Runnable() { 
      public void run() { 
       while (true) { 
        try { 
         Thread.sleep(2 * 1000L); 
        } catch (InterruptedException e) { 
        } 
        if (connClosed.get() && !connecting.get()) { 
         try { 
          connect(); 
         } catch (Exception e) { 
          logger.warn(e.getMessage(), e); 
         } 
        } 
       } 
      } 
     }).start(); 
and set connecting=true in connect function, and connecting = false in onConnect, onError, onClose method. set connClosed=true in onError,onClose, =false in onConnect. 

이런 방식으로 한 번에 onError를 몇 번이나 호출해도 한 번만 다시 연결됩니다.