Я обнаружил, что мой WebSocket закрыт через 30 минут.
Основная причина заключается в том, что сеанс http по умолчанию закрывается через 30 минут в SpringBoot.
В свойстве конфигурации SpringBoot server.servlet.session.timeout
изменит поведение по умолчанию, но может иметь некоторыепредел .
Кроме того, в соединениях WebSocket есть сообщения для пинг-понга, поэтому соединение никогда не должно закрываться, пока пинг-понг не прекратится.
После некоторой трассировки я нашел способ решить эту проблему:
- Таймер для закрытия соединения находится здесь
io.undertow.server.session.InMemorySessionManager.SessionImpl
в моем случае. - Как мы видим,
io.undertow.server.session.InMemorySessionManager.SessionImpl#setMaxInactiveInterval
сбросит таймер. - Этот метод будетбыть вызванным
javax.servlet.http.HttpSession#setMaxInactiveInterval
. - Итак, если
setMaxInactiveInterval
вызывается перед каждым тайм-аутом, соединение никогда не будет закрыто.
Вот моя реализация:
- Сохраните
HandshakeRequest
в javax.websocket.EndpointConfig#getUserProperties
в Конфигураторе javax.websocket.server.ServerEndpointConfig.Configurator#modifyHandshake
- Наши клиенты будут отправлять строковые сообщения, чтобы сохранить работоспособность, в методе
onMessage
возьмите HandshakeRequest
из javax.websocket.Session#getUserProperties
, затем
HttpSession httpSession = (HttpSession) handshakeRequest.getHttpSession();
httpSession.setMaxInactiveInterval((int) (session.getMaxIdleTimeout() / 1000));
Вот и все, надеюсь, это поможет.