4

需要一些帮助来了解断开连接发生的位置(SocketJS、Vertx)以及如何配置超时。

我正在创建SockJSServer以及创建 eventBus 桥。我观察到的问题是 WebSocket 连接频繁断开。查看 websocket 帧,我每 5 秒看到一次 ping 和每 1/2 秒配置的心跳(似乎生效)。但是,一旦心跳延迟更长的时间,那么 5 秒就会断开连接,消息 c[3000,'Go away'] 会出现。正如观察到的那样,当服务器很忙(在单独的线程上做其他事情)时会发生这种情况。

我搜索了 Vertx 文档并查看了 vertx 代码,发现配置参数很少(在版本和文档中似乎有所不同)。

.putNumber("ping_interval", 120000)
                    .putNumber("session_timeout", 1200000)
                    .putNumber("heartbeat_period",500)

可以肯定的是,我尝试了不同的配置,但似乎没有任何影响。在这一点上,我想我已经到了死墙,需要一些帮助。

Vertx 版本 2.1P3

服务器片段

final SockJSServer server = vertx.createSockJSServer(httpServer);
server.bridge(new JsonObject().putString("prefix", "/eventbus")
                    .putNumber("ping_interval", 120000)
                    .putNumber("session_timeout", 1200000)
                    .putNumber("heartbeat_period",500),
new JsonArray().addObject(new JsonObject()),
new JsonArray().addObject(new JsonObject()));

客户端代码:

var eventBus = new EventBus('//hostX:12001/eventbus');
4

1 回答 1

2

当您收到 SOCKET_IDLE 事件时,您无法使用“true”参数完成该事件,因为它表示必须关闭套接字:

SockJSHandler.create(vertx,handlerOptions).bridge(options, event -> { boolean result = true; switch(event.type()) { case SOCKET_CREATED: LOGGER.info("Socket created"); break; case SOCKET_IDLE: result = false; return; case SOCKET_CLOSED: LOGGER.info("Socket closed"); break; } event.complete(result); });

于 2018-08-30T18:23:32.927 回答