Spring websocket 和 Stomp.js - 我应该在订阅和发送之间等待多长时间?

Posted

技术标签:

【中文标题】Spring websocket 和 Stomp.js - 我应该在订阅和发送之间等待多长时间?【英文标题】:Spring websocket and Stomp.js - how long should i wait between subscribe and send? 【发布时间】:2014-08-30 10:38:15 【问题描述】:

我有以下代码(来自 spring websocket 演示应用程序):

    stompClient.connect(, function(frame) 
        setConnected(true);
        console.log('Connected: ' + frame);
        stompClient.subscribe('/user/queue/greeting', function(greeting)           
            displayQueueMessage(greeting);
        );

    function sendName() 
      var name = document.getElementById('name').value;
      stompClient.send("/app/wsdemo", , JSON.stringify(
        'name' : name
       ));
    

这是对服务器上队列的简单订阅调用,以及发送调用服务器的另一个方法“sendName()”。

调用 sendName 后,服务器响应 connect 方法提供的回调函数:

function(greeting)             
    displayQueueMessage(greeting);
);

我的问题是 - 客户应该从 subscribe 呼叫等待多长时间才能开始呼叫 sendName ?我的意思是,我可以在这里看到的潜在问题如下:

i) 客户端首先订阅队列,

ii) 客户端调用 sendName

iii) 服务器在收到订阅呼叫之前收到第二个呼叫。

iv) 客户端不会收到来自服务器的响应。

我的问题:

1) 这种情况真的是个问题吗?

2) 我怎样才能避免它?

3)我在某处读到,由于 websocket 与 tcp 一起使用,消息的顺序得以保持,所以我的最后一个问题是 - 对于不支持 websocket 的客户端,stompJS 的后备功能如何?订单也会维持吗?

【问题讨论】:

【参考方案1】:

由于您在连接阶段订阅了队列,因此您只需等待连接建立,然后再向服务器发送请求。

【讨论】:

【参考方案2】:

我想你解决了你的问题,现在知道什么是异步的承诺、回调和 javascript

订阅时:

  stompClient.subscribe('/user/queue/greeting', function(greeting)           
        displayQueueMessage(greeting);
    );

您将回调函数作为第二个参数传递,当且仅当订阅发生(成功请求)时,您的回调才会被执行。

如果你在回调中调用sendName(),或者使用任何其他方法来同步这两点,你可以避免它。

【讨论】:

当客户端接收到与订阅匹配的消息时执行该回调......而不是在创建订阅时。

以上是关于Spring websocket 和 Stomp.js - 我应该在订阅和发送之间等待多长时间?的主要内容,如果未能解决你的问题,请参考以下文章

Spring(Websockets / REST / Security)、JWT 和 Sockjs(Stomp)集成

Spring 4 websocket和stomp - 未到达控制器

使用Spring STOMP websockets向单个人发送消息

Spring 4 - websocket 消息传递 stomp 处理程序

如何使用 spring+stomp+sockjs 获得 websocket 响应

对如何使用 Spring-websockets 进行 stomp 调用感到困惑