【问题标题】:StompJS Websocket connected but doesn't return any messagesStompJS Websocket 已连接但不返回任何消息
【发布时间】:2021-10-02 20:09:07
【问题描述】:

我正在尝试与 @stomp/stompjs 建立 websocket 连接,尽管在控制台中连接成功,但数据没有更新,任何关于我做错了什么的想法,我已经在线阅读了所有内容我不明白为什么它不起作用。

import { Component, OnDestroy, OnInit } from '@angular/core';
import { Router } from '@angular/router';
import { Stomp } from '@stomp/stompjs';
import * as SockJS from 'sockjs-client';
import { MessagesService } from 'src/app/services/messages.service';

@Component({
  selector: 'app-classtwo',
  templateUrl: './classtwo.component.html',
  styleUrls: ['./classtwo.component.scss']
})
export class ClasstwoComponent implements OnInit, OnDestroy {

  public mail_list:any [] = []
  private stompClient = Stomp.over(new SockJS('http://localhost:8080/mailbot-websocket'));

  constructor(private service:MessagesService, private router: Router) { }

  ngOnInit(): void {
    this._loadEmailsFromRestApi()
    this._loadEmailsFromWebSocket()
  }

  private _loadEmailsFromWebSocket() {
    let that = this;
    this.stompClient.connect({}, () =>{
      that.stompClient.subscribe('/topic/processed/TYPE_II', this.callback)
    })
  }

  private _loadEmailsFromRestApi() {
    this.service.getPendingMailsByCategory('TYPE_II').subscribe( res => {
      this.mail_list = res
    })
  }

  ngOnDestroy(): void {
    if (this.stompClient != null) {
      this.stompClient.disconnect(()=> {
       console.log("DISCONECTED");
      });
    }
  }

  goToMailDescription(category:string, id:string) {
    this.router.navigate(['/mailDetail/' + category + '/' + id]);
  }

  callback = (message:any) => {
    if(message.body)
      this.mail_list = JSON.parse(message.body)
  }

}

注意:似乎在重新加载页面后它会收到消息,但只有在您继续运行它时它是相同的,直到再次重新加载。

【问题讨论】:

    标签: angular typescript websocket stomp


    【解决方案1】:

    如下声明 stomp 客户端

    public stompClient: CompatClient | undefined
    

    然后初始化它并在 init 部分中调用它

    ngOnInit() { this.initWebsocket() }
    
    initWebsocket(){
        let ws:WebSocket = new SockJS(`${DOMAIN_URL}`);
        this.stompClient = Stomp.over(ws);
        const that = this;
        this.stompClient.connect({}, (frame:any) => {
          if(!that.stompClient){
            return;
          }
    
          this._subcribeTopic(`${TOPIC_URL}`);
        });
      }
    

    然后只需添加订阅方法,其余的按你的需要做,这里是一个例子

    private _subcribeTopic(topic: string) {
        if(!this.stompClient){
          console.error("Error to configure websocket");
          return;
        }
        // You could add something like a switch statement here in case you have more than one topic
        this.stompClient.subscribe(topic, (message:any) => {
          if (message.body) {
            let model: any = JSON.parse(message.body);
            this._updateWebSocketResponse(model);
          }
        });
      }
    
      private _updateWebSocketResponse (response:any) {
        console.log(response)
      }
    

    我会建议停止与垃圾收集器的 websocket 连接,但这完全取决于你

    ngOnDestroy() { this.stompClient.disconnect() }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-10
      • 2019-12-23
      • 1970-01-01
      • 1970-01-01
      • 2011-11-19
      相关资源
      最近更新 更多