Вручную установите тип транспорта в приложении Spring + 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);
    });

}

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

1 ответ

Решение

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

Вы можете отключить транспорт 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}));

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

Некоторая проблема: websocket.js:72 Соединение WebSocket 'ws://192.168.56.1:8080/socket/055/tbeetgqk/websocket' не удалось: WebSocket закрывается до stomp.js:134 К сожалению! Потерянное соединение с http://192.168.56.1:8080/socket

Другие вопросы по тегам