В нашем приложении мы расширяем TextWebSocketHandler и переопределяем afterConnectionEstablished, afterConnectionClosed и handleTextMessage.
handleTextMessage просто игнорирует все, что отправляется на сервер, так как мы просто хотим использовать соединение websocket в случае события, происходящего на сервере. Как только событие обнаружено, оно помещается в очередь для подписанных веб-сокетов. Эта очередь обрабатывается пружинным методом @Scheduled (fixedDelay = 500).
afterConnectionEstablished отправляет текущее состояние системы новому клиенту после установления соединения и сохраняет сеанс для последующего использования вместе с запрошенным типом (определяется URL-адресом используемой конечной точки).
afterConnectionClosed используется для удаления закрытого сеанса websocket из памяти. В качестве меры безопасности мы проверяем перед отправкой на любой сеанс, если он открыт. Если сессия уже закрыта, мы также удаляем ее из памяти.
Чтобы разрешить соединения и установить разрешенные источники, мы реализуем WebSocketConfigurer, в котором registerWebSocketHandlers регистрирует маршруты, сопоставленные с упомянутым выше обработчиком websocket.
public void registerWebSocketHandlers(WebSocketHandlerRegistry webSocketHandlerRegistry) {
webSocketHandlers.entrySet().forEach(entry -> {
webSocketHandlerRegistry
.addHandler(entry.getValue(), entry.getKey())
.setAllowedOrigins("*");
webSocketHandlerRegistry
.addHandler(entry.getValue(), entry.getKey())
.setAllowedOrigins("*")
.withSockJS();
});
}
webSocketHandlers - это карта, в которой ключ карты содержит путь URL и значение WebSocketHandler.
Несмотря на то, что во время тестирования это работает нормально, время от времени происходит сбой без видимой причины. После этого кажется, что соединение через веб-сокет все еще можно установить, но больше ничего не принимается (никаких исходных данных, никаких данных о возникновении событий).
Может ли быть так, что операция отправки одному из клиентов, кажется, открыта для сервера, но не может получить данные и, следовательно, блокирует всех других клиентов?