#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