【问题标题】:ng2 stomp client unsubscribe() not workingng2 stomp 客户端取消订阅()不起作用
【发布时间】:2017-09-14 20:58:41
【问题描述】:

我正在使用 ng2-stomp-service 订阅套接字:

this.fooSubscription = this.stomp.subscribe('/topic/foo', (res) => {
    console.log('do stuff with res');
});

这非常适合接收数据。但是在某些时候(单击按钮时)我想停止接收数据。其他订阅仍在使用该连接,因此我只想取消订阅此特定订阅。单击按钮时发生这种情况:

unsubscribeFoo() {
    this.fooSubscription.unsubscribe();
}

但是,我仍然清楚地从该订阅获取数据,因为它是从服务器发送的。

当我取消订阅时,我在浏览器控制台中从 stomp 的调试输出中看到了这个,看起来很有希望:

>>> UNSUBSCRIBE
id:sub-3

但是很遗憾,我仍然会在片刻之后获得数据。

【问题讨论】:

  • 我也有同样的问题,你找到解决办法了吗?
  • @Mardari 不,我最终只是打开了多个连接并在每个连接上创建一个订阅,允许我通过断开特定连接来停止单个订阅的数据流。一定有更好的方法,但我找不到。

标签: angular stomp


【解决方案1】:

我知道这是一个老问题,但对于任何偶然发现这个问题的人来说,取消订阅函数引用的是主题的 id,而不是实际的主题。

可以在订阅函数中设置id:

client.subscribe(topic, messageHandler, { id: “myTopicId”});

现在你可以这样取消订阅:

client.unsubscribe(“myTopicId”);

【讨论】:

    【解决方案2】:

    我认为您需要在单击按钮时断开 stomp 的连接:

    this.stomp.disconnect();
    

    您所做的应该会导致控制台消息“do stuff with res”停止通过,但这不会断开 stomp 客户端的连接。

    如果上述方法不起作用,请尝试在断开 stompClient 之前浏览所有 stompclient 订阅和取消订阅

    for (const sub in this.stomp.subscriptions) {
      if (this.stomp.subscriptions.hasOwnProperty(sub)) {
        this.stomp.unsubscribe(sub);
      }
    }
    

    我一直在直接使用 stompJs(不是 ng2-stomp),这对我有用。

    【讨论】:

    • 很遗憾,我无法断开连接,因为我还有其他订阅正在积极接收数据,我无法停止这些订阅。所有订阅都使用相同的连接。我只想停止来自某个特定订阅的数据。
    【解决方案3】:

    我们在 @stomp/stompjs 和 Spring Boot 中遇到了类似的问题,最终导致后端处理传入订阅时出现问题。

    每当收到SUBSCRIBE 消息时,后端都会发出“阻塞”请求以获取更多数据。只有在这个附加请求完成后,它才会开始处理下一条SUBSCRIBE 消息。

    如果这个请求需要一段时间才能完成,或者当有很多SUBSCRIBE消息进来时,客户端发出的UNSUBSCRIBE消息在相关的SUBSCRIBE消息被处理之前到达。这意味着UNSUBSCRIBE 不做任何事情,不久之后SUBSCRIBE 消息无论如何都会被处理并开始生成消息而不会停止。

    解决此问题的方法是在后端异步处理该附加请求。删除请求解决了问题,这证实了我们的怀疑。

    不是 100% 确定这是相同的根本原因,但我希望它可以帮助遇到类似问题的其他人。

    更多内容请见stomp-js/stompjs#370

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-25
      • 2020-10-16
      • 2018-08-01
      • 2018-12-30
      • 1970-01-01
      • 1970-01-01
      • 2016-08-13
      • 1970-01-01
      相关资源
      最近更新 更多