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

标签 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?

最佳答案

如果您的服务器不支持 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 进行连接。

关于java - 在 Spring + Sockjs 应用程序上手动设置传输类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39998653/

相关文章:

java - 在 print 语句中使用类型转换运算符

java - Mockito 在同一个 NavigationSet 上提供无限 while 循环和有限 for 循环

sql - 将 SQL 文件包含到另一个 SQL 文件中

java - Spring容器是如何创建的?

java - Android 长轮询 TCP 连接

php - 什么是长轮询、Websocket、服务器发送事件 (SSE) 和 Comet?

javascript - 如何使用来自不同域的长轮询?

java - 如何阻止 BasicArrowButton 展开以占用整个工具栏?

java - 按键删除一个实体而不先在应用程序引擎中获取它(使用 JDO)

java - 在本地网络 IP 192.168.X.X 上运行 Spring 应用程序