ng2 stomp客户端unsubscribe()无效

时间:2017-09-14 20:58:42

标签: angular stomp

我使用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

但是,唉,我还是会在不久之后得到数据。

3 个答案:

答案 0 :(得分:1)

我知道这是一个老问题,但是对于任何偶然发现此问题的人,退订功能将引用主题的ID,而不是实际的主题。

您可以在订阅功能中设置ID:

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

现在您可以像这样取消订阅:

client.unsubscribe(“myTopicId”);

答案 1 :(得分:0)

我认为你需要在单击按钮时断开stomp:

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

你做了什么应该导致控制台消息'do stuff with res'停止通过,但不会断开stomp客户端。

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

request-promise

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

答案 2 :(得分:0)

我们在使用 func provideObjectCollection(for intent: ConfigurationIntent, with completion: @escaping (INObjectCollection<Object>?, Error?) -> Void) { let error = NSError(domain: "test", code: 666, userInfo: [NSLocalizedDescriptionKey : "This is an error."]) completion(nil, error) } 和 Spring Boot 时遇到了类似的问题,最终导致在后端处理传入订阅时出现问题。

每当 @stomp/stompjs 消息传入时,后端都会执行“阻塞”请求以获取其他数据。只有在此附加请求完成后,它才会开始处理下一个 SUBSCRIBE 消息。

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

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

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

可以在 stomp-js/stompjs#370 中找到更多上下文。