Весенняя паутина перестала обслуживаться - PullRequest
0 голосов
/ 13 сентября 2018

В нашем приложении мы расширяем 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.

Несмотря на то, что во время тестирования это работает нормально, время от времени происходит сбой без видимой причины. После этого кажется, что соединение через веб-сокет все еще можно установить, но больше ничего не принимается (никаких исходных данных, никаких данных о возникновении событий).

Может ли быть так, что операция отправки одному из клиентов, кажется, открыта для сервера, но не может получить данные и, следовательно, блокирует всех других клиентов?

...