Ручная установка типа транспорта в приложении Spring Sockjs

#java #spring #long-polling #spring-websocket #sockjs

#java #spring #длительный опрос #spring-websocket #sockjs

Вопрос:

Мне нужно установить приложение на сервере, не совместимом с JEE7. Я использую Spring Stomp SocksJs для уведомлений в реальном времени.

Мой код выглядит следующим образом:

 @Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/topic");
        config.setApplicationDestinationPrefixes("/app");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry ser) {
        ser.addEndpoint("/notifications").withSockJS()
    }

   }

}
  

И на клиенте:

 function setSocket(broker, callbackFn) {

    var socket = {};

    socket.cliente = new SockJS(path   broker);
    socket.stomp = Stomp.over(socket.cliente);

    socket.stomp.connect({}, function () {
        socket.stomp.subscribe("/topic"   broker, callbackFn);
    });

}
  

Есть ли какой-либо способ вручную установить тип транспорта для использования и избежать использования websockets?

Ответ №1:

Если ваш сервер не поддерживает websockets, убедитесь, что он по-прежнему поддерживает асинхронную обработку.

Вы можете отключить транспорт websocket на стороне сервера с помощью следующей опции:

 @Override
public void registerStompEndpoints(StompEndpointRegistry ser) {
    ser.addEndpoint("/notifications").withSockJS().setWebSocketEnabled(false);
}
  

Клиенты SockJS автоматически выберут наилучший доступный транспорт, поддерживаемый сервером. В вашем случае это предпочтительный способ справиться с этим.

Как объясняется в документации клиента SockJS, вы можете ограничить доступные транспорты на стороне клиента с transports помощью аргумента при создании клиента SockJS.

 sockJsProtocols = ["xhr-streaming", "xhr-polling"];
socket.cliente = new SockJS(url, null, {transports: sockJsProtocols}));
  

Полный список доступных транспортов находится здесь. Но технически, если вы не ограничиваете доступные транспорты на стороне сервера, клиент все равно может попытаться подключиться с помощью websockets.

Комментарии:

1. Спасибо! это было именно то, что мне было нужно.

2. Я отредактировал свой ответ — в вашем случае вы хотите ограничить доступные перевозки на стороне сервера . Это работает только на клиенте, но не мешает клиенту попытаться подключиться к вашему серверу с помощью websockets, если этот клиент настроен иначе.

3. Я вручную остановил сервер, через пару минут снова запустил сервер, клиент показывает сообщение типа Открытие веб-сокета …, не подключая websocket