javascript - 一次请求中从 JS 到 Spring 的多个 STOMP 订阅

标签 javascript java spring stomp sockjs

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

所以我正在寻找替代的单请求解决方案。让我整理一下问题:

1) 有没有一种方法可以同时向多个订阅发出一个客户端 STOMP 请求?如果可以使用其他 JS 库发出这样的请求 - 那么我很乐意尝试。

2) 有没有办法从Spring后端发起订阅?在服务器端为一个客户端注册多个目标消息查询会很棒 - 我可以为此使用特殊请求或在登录期间执行此操作。

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

下面的代码是最简单的 echo 服务。我只是测试这个协议(protocol)和技术。

基本客户端代码:

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 :

@Controller
public class GreetingController {

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

最佳答案

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

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

关于javascript - 一次请求中从 JS 到 Spring 的多个 STOMP 订阅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57034167/

相关文章:

javascript - Nodemon查看所有项目目录

javascript - 如果没有 Node.js 或运行服务器,是否可以使用纯 JavaScript 通过 HTML 应用程序创建/输出 JSON 文件到硬盘?

javascript - AJAX和php JSON连接DB并返回值

java - Cookie http 仅适用于 spring security 和 servlet 2.5?

javascript - 如何在复选框列表中移动复选标记?

java - SimpleDate 允许 null

Spring @RequestPart 多部分/混合对象错误

java - 将 bean 注入(inject)到 GraphQL 的 DataFetcher 中

java - 使用 jdbcTemplate 时如何手动处理事务?

java - 如何在不使用 readLine() 的情况下检查 EOF?