У меня есть проект весенней загрузки, в котором я реализовал веб-сокеты. Я не использовал STOMP, вместо этого я реализовал TextWebSocketHandler
, который обрабатывает все сообщения.
Чтобы обработать отключение сеанса при сбое сети, я использовал схему пинг-понга, как указано ниже в этой теме обработка потери соединения с веб-сокетами
- Существует периодическое задание, которое отправляет
PingMessage
каждому WebSocketSession
. Я сохраняю флаг для каждой сессии, который указывает, был ли получен понг или нет.
- Перед отправкой сообщения пинга я проверяю, получил ли я понг для ранее отправленного пинга, если нет, то я закрываю сеанс, используя
close()
метод WebSocketSession
класс
- При получении сообщения pong я обновляю флаг сеанса
Теперь проблема в том, что когда я пытаюсь закрыть сессию, другие сессии также закрываются. Я добавил несколько журналов в обратный вызов afterConnectionClosed()
, и я вижу, что он запускается для сеансов, отличных от того, для которого я вызвал метод close()
.
Я не уверен, почему это происходит.
Кроме того, есть ли другой способ справиться с потерей соединения в веб-сокетах
Ниже приведена информация о версиях
- Spring boot version 1.5.10.RELEASE
- JDK 1,8