在一个请求中从JS到Spring进行多个STOMP订阅

时间:2019-07-15 06:21:30

标签: javascript java spring stomp sockjs

目标是使用Web界面和Spring框架进行多人聊天。看来STOMP胜过SockJS是此类项目的最佳组合。 STOMP的基于目的地的订阅解决了所有广播问题。但是,如果用户一次使用100个聊天(例如),那么我每次登录时都需要从Web客户端发送100个订阅请求。

所以我正在寻找替代的一请求解决方案。让我来巩固问题:

1)是否可以同时对多个订阅发出一个客户端STOMP请求?如果可以使用其他JS库发出此类请求-那么我将很乐于尝试。

2)有没有办法从Spring后端启动订阅?为服务器端的一个客户端注册多个目标消息查询非常好-我可以为此使用特殊请求,也可以在登录期间执行该请求。

3)关于此问题还有其他建议吗?再次:我很高兴尝试其他流行技术作为最后的手段。

代码beloiw是最简单的回显服务。我正在测试此协议和技术。

基本客户端代码:

window.onload = function () {
    window.s = new SockJS("http://localhost:8080/portfolio");
    window.s.onopen = function () {
        window.stompClient = Stomp.over(window.s);

        stompClient.connect('admin', 'admin', function(frame) {
            console.log('Connected: ', frame);
            stompClient.subscribe('/topic/echo', function(messageOutput) {
                console.log(messageOutput.body);
            })}, function(e){console.log("Fail My: ", e);})();
    };
};

STOMP配置:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/portfolio").setAllowedOrigins("*").withSockJS()
        .setClientLibraryUrl( "https://cdn.jsdelivr.net/npm/sockjs-client@1.3.0/dist/sockjs.min.js" );
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {

        registry.enableSimpleBroker("/topic/");
        registry.setApplicationDestinationPrefixes("/app");
    }
}

STOMP控制器:

@Controller
public class GreetingController {

    @MessageMapping("/greetings")
    @SendTo("/topic/echo")
    public String handleMessage(@Payload String greeting) {
        System.out.println("[received]:" + greeting);
        return "[echo]: " + greeting;
    }
}

1 个答案:

答案 0 :(得分:0)

The STOMP specification表示1 SUBSCRIBE帧与1个订阅相关。换句话说,无法为单个SUBSCRIBE框架获得多个订阅。

一个库/ API有可能(尽管在我看来是不可能的)包装一次调用即可发送多个SUBSCRIBE帧的功能,但这只是一种便捷方法,实际上不会产生任何形式协议级别的性能优势。