簡體   English   中英

ng2 stomp 客戶端取消訂閱()不起作用

[英]ng2 stomp client unsubscribe() not working

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

但是,很遺憾,我仍然在片刻之后獲得數據。

我知道這是一個老問題,但對於任何偶然發現的人來說,取消訂閱功能引用主題的 id,而不是實際主題。

您可以在訂閱功能中設置 id:

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

現在你可以像這樣調用取消訂閱:

client.unsubscribe(“myTopicId”);

我認為您需要在單擊按鈕時斷開跺腳:

this.stomp.disconnect();

您所做的應該導致控制台消息“使用 res 執行操作”停止通過,但這不會斷開 stomp 客戶端的連接。

如果上述方法不起作用,請嘗試在斷開 stompClient 之前完成所有 stompclient 訂閱和取消訂閱

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

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

我們在使用@stomp/stompjs和 Spring Boot 時遇到了類似的問題,最終在后端處理傳入訂閱時出現問題。

每當SUBSCRIBE消息時,后端都會執行“阻塞”請求以獲取其他數據。 只有在此附加請求完成后,它才會開始處理下一個SUBSCRIBE消息。

如果此請求需要一段時間才能完成,或者當有大量SUBSCRIBE消息UNSUBSCRIBE時,客戶端發出的UNSUBSCRIBE消息會在相關SUBSCRIBE消息被處理之前到達。 這意味着UNSUBSCRIBE不會做任何事情,過了一會兒,無論如何都會處理SUBSCRIBE消息並開始生成消息而不會停止。

對此的解決方法是在后端異步處理該額外請求。 刪除請求解決了問題,這證實了我們的懷疑。

不是 100% 確定這是相同的根本原因,但我希望它可以幫助遇到類似問題的其他人。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM