【问题标题】:how to await subscriptions established?如何等待订阅建立?
【发布时间】:2017-11-11 16:40:15
【问题描述】:

我有以下js代码:

stompClient.subscribe('/topic/clients', function (calResult) {
    updateClientsTable(JSON.parse(calResult.body));
});
$.get("/clients", null);

和下面的服务器代码(最后一行调用它):

 @GetMapping(value = {"/clients"})
 @ResponseBody
 public void loadClients() {
      brokerMessagingTemplate.convertAndSend("/topic/clients", clientService.getClientList());
 }

有时前端会错过$.get("/clients", null);的结果

据我了解问题:在前端获得结果的那一刻,订阅不会发生。

如果将$.get("/clients", null); 放在代码下方 - 一切正常。

您能解释一下如何等待已建立的订阅吗?

【问题讨论】:

  • 我假设您已经通过 .connect() 建立了一个有效的 stomp 连接,但是在您查询主机一次之前,以后的订阅无法获取消息? STOMP 不为“成功”订阅提供回调。
  • 它不会不断复制。我不明白这句话:直到你查询主机一次

标签: javascript spring-mvc websocket stomp sockjs


【解决方案1】:

我认为不将 REST 请求与这种消息传递模式混合会更有意义。

您是否考虑过通过 SockJS 将“updateClients”命令发送到回复“/topic/clients”频道的“/apps/updateClients”频道?

【讨论】:

    【解决方案2】:

    正如@light_303 已经提到的,将 HTTP 请求与通知机制混合是不好的。您可以在客户端连接时注册时刻(/clients 上的 GET 请求),但当他断开连接时您无法注册。

    您应该以下列方式之一进行思考。当用户订阅/topic/clients时:

    1. 您单独向他发送包含所有客户列表的响应,然后仅推送更新。
    2. 您单独向他发送当前服务器时间或某种 ID,然后仅推送更新。用户在对/clients 的 GET 请求中使用给定的时间/ID,并在那一刻收到完整的客户列表。当您有增量更新(即向列表中添加新元素)时,此选项可能很好,否则不太好。

    检查这个问题:Sending message to specific user on Spring Websocket

    这其实很可笑,Spring 怎么能把事情复杂化。我建议您查看其他用于实时 Web 通信的框架,例如 Vert.x 或 Netty 以及 on Go 编程语言。使用 WebSockets 或 SockJS 而不是 STOMP。所有这些技术都可以以明显的方式为您提供更灵活和高性能的解决方案。另外,检查Centrifugo 项目,也许它与您的任务相关。

    【讨论】:

      【解决方案3】:

      你可以使用spring-messaging中的@SubscribeMapping注解。

      如果您按照herehere 的描述配置了spring-messaging,则服务器端代码可能如下所示:

      @Controller
      public class MessagingController {
          @SubscribeMapping("/clients")
          public List<Client> loadClients() {
              return clientService.getClientList();
          }
      }
      

      这样您就不必调用$.get("/clients", null);,因为JS 消息处理程序会在订阅发生后立即收到loadClients() 调用的结果。 JS 代码如下所示:

      stompClient.subscribe('/topic/clients', function (calResult) {
          updateClientsTable(JSON.parse(calResult.body));
      });
      

      【讨论】:

        猜你喜欢
        • 2021-05-06
        • 2021-06-08
        • 1970-01-01
        • 2020-12-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多