user629299
user629299

Reputation: 141

Vertx SocketJS disconnects after few seconds of server being busy

Need some help understanding on where disconnects occur (SocketJS, Vertx) and how timeouts can be configured.

I am creating SockJSServer along with creating eventBus bridge. Problem that I observer is frequent WebSocket connection disconnects. Looking at the websocket frames, I see pings every 5 seconds and heart-beats what I configured every 1/2 sec(what seem to take effect). However, once heart beats are being delayed for longer then 5 second disconnects comes with message c[3000,'Go away']. As observed it happens when server is busy(doing something else on separate thread).

I have searched Vertx documentation and looked over vertx code and found few configuration parameter(which appear to be different across versions and documentation).

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

To be absolutely sure, I have tried different config that did not appear to have any impact. At this point, I think I have reached dead wall and need some help.

Vertx version 2.1P3

Server snipet

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

Client code:

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

Upvotes: 4

Views: 1454

Answers (1)

João Marcus
João Marcus

Reputation: 1608

When you receive a SOCKET_IDLE event, you can't complete the event with a "true" parameter, as it indicates the socket must be closed:

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

Upvotes: 2

Related Questions