Java 在Vertx中,如何在一段时间后实现WebSocket客户端重新连接?

Java 在Vertx中,如何在一段时间后实现WebSocket客户端重新连接?,java,websocket,vert.x,Java,Websocket,Vert.x,我正在使用vertx连接websocket服务器,但当连接关闭时/服务器(暂时)关闭,请在一段时间后尝试重新连接 WebSocket代码为: public void start() throws Exception { HttpClient client = vertx.createHttpClient(); MultiMap form = MultiMap.caseInsensitiveMultiMap(); if(MapUtils.isNotEmpty(header)) {

我正在使用vertx连接websocket服务器,但当连接关闭时/服务器(暂时)关闭,请在一段时间后尝试重新连接

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);

}
public void start()引发异常{
HttpClient=vertx.createHttpClient();
MultiMap form=MultiMap.caseinsensitivimultimap();
if(MapUtils.isNotEmpty(标题)){
页眉.forEach((k,v)->{
表格集(k,v);
});
}
RequestOptions=newrequestoptions()
.setHost(主机)
.setPort(端口)
.setSsl(sslFlag)
.setURI(uri);
处理程序套接字=新处理程序(){
@凌驾
公共无效句柄(WebSocket事件){
事件处理程序(数据->{
currentCount=0;
LOGGER.info(“接收数据”+数据toString(“ISO-8859-1”);
});
}
};
处理程序异常=新处理程序(){
@凌驾
公共无效句柄(可丢弃事件){
错误(“Websocket连接中发生异常,重试计数为{}”,currentCount,event);
}
};
websocket(选项、表单、套接字、异常);
}

以上代码端口、主机等均已配置。有人建议如何重新连接吗

您可以关闭客户端并重新启动它:

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

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

    client.webSocket(8080, "localhost", "/", (ar) -> {
        if (ar.succeeded()) {
            WebSocket ctx = ar.result();
            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);
                });
            });
        } else {
            System.out.println(ar.cause());
        }
    });
}
已编辑:连接时发生的任何异常也将在下面的代码中重试

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);
      });
  });
}

我已经用io尝试过了。vertx:vertxWeb客户端:4.0.0-milestone4它可以工作,但有一个缺点。每次调用setTimer都会导致新线程的实例化,比如
vert.x-eventloop-thread-99
,而之前的线程则挂起