У меня есть приложение реального времени с клиентами, использующее websockets для подключения к серверу Spring Framework, на котором запущен Spring Boot Tomcat. Я хочу, чтобы сервер быстро (в течение 5 секунд) обнаружил, когда клиент перестает отвечать из-за отключения сети или другой проблемы и закрывает веб-узел.
Я пробовал
-
Установка максимального тайм-аута ожидания сеанса, как описано в документации как "Настройка механизма WebSocket", http://docs.spring.io/spring/docs/current/spring-framework-reference/html/websocket.html
@Bean public WebSocketHandler clientHandler() { return new PerConnectionWebSocketHandler(ClientHandler.class); } @Bean public ServletServerContainerFactoryBean createWebSocketContainer() { ServletServerContainerFactoryBean container = new ServletServerContainerFactoryBean(); container.setMaxSessionIdleTimeout(5000); container.setAsyncSendTimeout(5000); return container; }
Я не уверен, что это реализовано правильно, потому что я не вижу связи между ServletServerContainerFactoryBean и моим поколением ClientHandlers.
-
Отправка сообщений ping с сервера каждые 2,5 секунды. После того, как я вручную отключу клиента, нарушив сетевое подключение, сервер с радостью отправит пинги еще на 30 секунд, пока не появится ошибка транспорта.
-
1 и 2 одновременно
-
1 и 2 и установка
server.session-timeout = 5
в application.properties
Моя методология для тестирования:
- Подключите веб-узел с ноутбука к серверу Tomcat.
- Отключите сетевое подключение на ноутбуке с помощью физического переключателя
- Ожидание событий сервера Tomcat
Как сервер Spring быстро обнаруживает, что клиент был отключен или не отвечает на закрытие websocket?