Как реализовать переподключение клиента WebSocket через некоторое время в Vertx? - PullRequest
0 голосов
/ 09 февраля 2019

Я подключаю сервер веб-сокетов с помощью vertx, но когда соединение закрыто / Сервер отключился (временно), попробуйте повторно подключиться через некоторое время.

Код WebSocket:

public void start() throws Exception {

  HttpClient client = vertx.createHttpClient();
  MultiMap form = MultiMap.caseInsensitiveMultiMap();
  if(MapUtils.isNotEmpty(header)) {
    header.forEach((k,v)-> {
      form.set(k, v);
    });
  }

  RequestOptions options = new RequestOptions()
     .setHost(host)
     .setPort(port)
     .setSsl(sslFlag)
     .setURI(uri);

  Handler<WebSocket> socket = new Handler<WebSocket>() {

    @Override
    public void handle(WebSocket event) {
      event.handler(data -> {
        currentCount = 0;
        LOGGER.info("Received data " + data.toString("ISO-8859-1"));
      });
    }
  };

  Handler<Throwable> exception = new Handler<Throwable>() {
    @Override
    public void handle(Throwable event) {
      LOGGER.error("Exception occured in Websocket connection, retrying count is {}", currentCount, event);
    }
  };
  client.websocket(options, form, socket , exception);

}

ВышеКод Порт, Хост и т. д. настроены.Пожалуйста, кто-нибудь предложить, как восстановить?

1 Ответ

0 голосов
/ 10 февраля 2019

Вы можете закрыть клиент и перезапустить его:

public void start() {
    startClient(this.vertx);
}

private void startClient(Vertx vertx) {
    HttpClient client = vertx.createHttpClient();

    client.websocket(8080, "localhost", "/", (ctx) -> {
        ctx.textMessageHandler((msg) -> {
            System.out.println("Client " + msg);
            ctx.writeTextMessage("pong");
        }).exceptionHandler((e) -> {
            System.out.println("Restarting in 10 seconds");
            client.close();
            vertx.setTimer(10 * 1000, (__) -> {
                startClient(vertx);
            });
        });
    });
}

Отредактировано: Любое исключение при подключении также повторится в приведенном ниже коде.

private void startClient(Vertx vertx) {
  HttpClient client = vertx.createHttpClient();
  MultiMap form = MultiMap.caseInsensitiveMultiMap();
  if(MapUtils.isNotEmpty(header)) {
    header.forEach((k,v)-> {
      form.set(k, v);
    });
  }
  RequestOptions options = new RequestOptions()
     .setHost(host)
     .setPort(port)
     .setSsl(sslFlag)
     .setURI(uri);
  client.websocket(options, form, (ctx) ->{
    ctx.textMessageHandler( msg -> {
      System.out.println("Client " + msg);
    }).exceptionHandler((e) -> {
        client.close();
        vertx.setTimer(waitTime * 10 * 1000, (__) -> {
          startClient(vertx);
        });
    });
  }, (exec) -> {
      vertx.setTimer(waitTime * 10 * 1000, (__) -> {
        startClient(vertx);
      });
  });
}
...