我使用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
但是,唉,我还是会在不久之后得到数据。
答案 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 中找到更多上下文。