Vertx SocketJS отключается через несколько секунд, когда сервер занят

Нужна помощь в понимании того, где происходят отключения (SocketJS, Vertx) и как можно настроить тайм-ауты.

Я создаю SockJSServer вместе с созданием моста eventBus. Проблема в том, что я наблюдаю, что соединение WebSocket часто отключается. Глядя на кадры веб-сокета, я вижу пинги каждые 5 секунд и сердцебиение, которое я настроил каждые 1/2 секунды (что, кажется, вступает в силу). Однако если сердцебиение задерживается более чем на 5 секунд, разъединение сопровождается сообщением c[3000,'Уходи']. Как видно, это происходит, когда сервер занят (делает что-то еще в отдельном потоке).

Я просмотрел документацию Vertx, просмотрел код Vertx и нашел несколько параметров конфигурации (которые кажутся разными в разных версиях и документации).

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

Чтобы быть абсолютно уверенным, я пробовал разные конфигурации, которые, похоже, не оказали никакого влияния. В этот момент я думаю, что достиг мертвой стены и нуждаюсь в помощи.

Вертекс версии 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');

person user629299    schedule 12.02.2015    source источник
comment
никто не сталкивался с такой же проблемой?   -  person user629299    schedule 14.02.2015


Ответы (1)


Когда вы получаете событие 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); });

person João Marcus    schedule 30.08.2018