Отключение сеанса Websocket при потере соединения с помощью ping / pong - PullRequest
2 голосов
/ 26 марта 2019

У меня есть проект весенней загрузки, в котором я реализовал веб-сокеты. Я не использовал STOMP, вместо этого я реализовал TextWebSocketHandler, который обрабатывает все сообщения.


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

  • Существует периодическое задание, которое отправляет PingMessage каждому WebSocketSession. Я сохраняю флаг для каждой сессии, который указывает, был ли получен понг или нет.
  • Перед отправкой сообщения пинга я проверяю, получил ли я понг для ранее отправленного пинга, если нет, то я закрываю сеанс, используя close() метод WebSocketSession класс
  • При получении сообщения pong я обновляю флаг сеанса

Теперь проблема в том, что когда я пытаюсь закрыть сессию, другие сессии также закрываются. Я добавил несколько журналов в обратный вызов afterConnectionClosed(), и я вижу, что он запускается для сеансов, отличных от того, для которого я вызвал метод close().

Я не уверен, почему это происходит.

Кроме того, есть ли другой способ справиться с потерей соединения в веб-сокетах


Ниже приведена информация о версиях

  • Spring boot version 1.5.10.RELEASE
  • JDK 1,8
...