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

时间:2016-10-12 12:28:26

标签: java spring long-polling 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?

2 个答案:

答案 0 :(得分:7)

如果您的服务器不支持websockets,请确保它仍然支持异步处理。

您可以使用以下选项禁用服务器端的websocket传输:

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

SockJS客户端将自动选择服务器支持的最佳可用传输。在您的情况下,这是处理此问题的首选方法。

SockJS client documentation中所述,您可以在创建SockJS客户端时使用transports参数限制客户端上的可用传输。

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

完整list of available transports is here。但从技术上讲,如果您不限制服务器端的可用传输,客户端仍然可以尝试使用websockets进行连接。

答案 1 :(得分:-2)

一些问题: 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

的连接断开