在Spring + Sockjs应用程序中手动设置传输类型

8
我需要在一个不符合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个回答

18
如果您的服务器不支持WebSockets,请确保它仍然支持异步处理。
您可以通过以下选项在服务器端禁用WebSocket传输:
@Override
public void registerStompEndpoints(StompEndpointRegistry ser) {
    ser.addEndpoint("/notifications").withSockJS().setWebSocketEnabled(false);
}

SockJS客户端会自动选择服务器支持的最佳可用传输方式。在您的情况下,这是处理此问题的首选方法。
正如在SockJS客户端文档中所解释的那样,您可以在创建SockJS客户端时使用transports参数限制客户端端可用的传输方式。
sockJsProtocols = ["xhr-streaming", "xhr-polling"];
socket.cliente = new SockJS(url, null, {transports: sockJsProtocols});

完整的可用传输方式在这里列出。但从技术上讲,如果你没有在服务器端限制可用的传输方式,客户端仍然可以尝试使用WebSockets进行连接。

1
谢谢!那正是我所需要的。 - pallendes
1
我已编辑我的答案 - 在你的情况下,你想要限制可用的传输方式在服务器端。仅在客户端上这样做可以工作,但不能防止一个已经配置了其他方式连接到你的服务器的客户端尝试使用websocket连接。 - Brian Clozel
我已经手动停止了服务器,过了几分钟后又重新启动了服务器,客户端显示的消息是“正在打开Web Socket...”,但并未连接成功websocket。 - Manohar Pamishetty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接