vue基于stompjs封装进行实时消息获取

本文介绍了STOMP协议的基本概念,包括如何通过客户端向服务端发送消息和订阅服务端消息的方法。同时,还提供了一个使用stompjs实现的StompClient类示例,展示了如何建立连接、订阅消息、处理接收到的数据以及关闭连接等操作。
import Stomp from 'stompjs'

// tips
// 发送消息
// 客户端向服务端发送消息利用send()方法,此方法有三个参数:第一个参数(string)必需,为发送消息的目的地;第二个参数(object)可选,包含了额外的头部信息;第三个参数(string)可选,为发送的消息。
// client.send(destination, {}, body)

// 订阅消息
// 订阅消息也就是客户端接收服务端发送的消息,订阅消息可以利用subscribe()方法,此方法有三个参数:第一个参数(string)必需,为接收消息的目的地;第二个参数必需为回调函数;第三个参数{object}为可选,包含额外的头部信息。
// client.subscribe(destination, callback, {})

// 取消订阅消息可以利用unsubscribe()方法:
//  let mySubscribe =  client.subscribe
//  mySubscribe.unsubscribe()

// 客户端订阅消息可以订阅广播,如下所示:
// client.subscribe('/topic/msg',function(messages){
//     console.log(messages)
// })

// 也可以进行一对一消息的接收:
// 第一种方式
// const userId = 666;
// client.subscribe('/user/' + userId + '/msg',,function(messages){
//     console.log(messages)
// })
// 第二种方式
// client.subscribe('/msg',function(messages){
//     console.log(messages)
// }, {"userId ": userId  })

class StompClient {
  constructor(rmqServer, rmqVirtualHost, rmqAccount, rmqPassword) {
    this.queueName = '' // 队列名
    this.client = null
    this.frame = null
    this.options = {
      vhost: rmqVirtualHost,
      incoming: 10000, // 接收频率,默认10000ms
      outgoing: 10000, // 发送频率,默认10000ms
      account: rmqAccount,
      pwd: rmqPassword,
      server: `ws://${rmqServer}/ws`,
      message: ''
    }
  }

  // routerKey
  getQueueName() {
    this.queueName = 'xxx'
  }

  connect(options) {
    this.options = { ...this.options, ...options }
    const mqUrl = this.options.server
    const ws = new WebSocket(mqUrl)
    ws.onclose = (close) => {
      console.log('webSocket关闭', close)
    }
    ws.onerror = (error) => {
      console.log('webSocket异常', error)
    }
    ws.onopen = (success) => {
      console.log('webSocket连接成功', success)
    }
    this.client = Stomp.over(ws)
    this.client.heartbeat.incoming = this.options.incoming
    this.client.heartbeat.outgoing = this.options.outgoing
    this.client.debug = null // 关闭控制台调试
    // mq连接
    const onConnect = async () => {
      console.log('stomp 连接成功!')
      // 订阅消息
      this.subscribe()
    }
    // mq错误重新进行连接
    const onError = (errorMsg) => {
      console.error(`stomp 断开连接,正在准备重新连接...`, errorMsg)
      this.connect(this.options)
    }
    // 连接
    this.client.connect(
      this.options.account, // 用户名
      this.options.pwd, // 密码
      onConnect,
      onError,
      this.options.vhost
    )
  }
  // 消息订阅
  subscribe() {
    this.getQueueName()
    if (!this.queueName) {
      return
    }
    this.client.subscribe(
      `/exchange/amq.direct/${this.queueName}`,
      this.onMessage.bind(this),
      this.onSubscribeFailed.bind(this),
      {
        'auto-delete': 'true'
      }
    )
  }
  // 关闭mq连接
  closeConnect() {
    this.client.disconnect(() => {
      console.log('已关闭mq连接')
    })
  }
  onMessage(frame) {
    const data = frame && JSON.parse(frame.body)
    console.log('data :>> ', data.index)
    this.options.message = data
    // console.log('data :>> ', data)
  }

  onSubscribeFailed(frame) {
    console.log('rabbitmq subscribe failed')
  }
}

const RMQ_SERVER = '10.0.0.0:15674' // mq服务地址
const RMQ_VIRTUAL_HOST = 'xx' // 虚拟主机
const RMQ_ACCOUNT = 'xxx' // 用户名
const RMQ_PASSWORD = 'xxx' // 密码

export default new StompClient(RMQ_SERVER, RMQ_VIRTUAL_HOST, RMQ_ACCOUNT, RMQ_PASSWORD)

  watch: {
    opt: {
      deep: true,
      immediate: true,
      handler(newVal) {
        this.fileDetail = (newVal && newVal.message) || {}
        // console.log('fileDetail :>> ', this.fileDetail)
      }
    }
  },
  // 使用
  // mounted() {
  //   StompClient.connect()
  //   this.opt = StompClient.options
  // },
  // beforeDestroy() {
  //   StompClient.closeConnect()
  // },
Vue.js (简称 Vue) 是一款流行的前端JavaScript框架,主要用于构建用户界面。StompJS 是一个轻量级的消息发布/订阅库,它简化了WebSocket的使用,特别是与消息队列系统如 RabbitMQ 的集成。 RabbitMQ 是一个开源的企业级消息中间件,用于在分布式系统中可靠地传递消息。在 Vue 项目中,结合 StompJS 和 RabbitMQ 可以实现实时应用程序间的通信,比如在Web应用中处理用户的实时通知、数据推送等场景。 要将 VueStompJS 和 RabbitMQ 配合使用,通常步骤如下: 1. **安装依赖**:首先需要在你的 Vue 项目中安装 `stompjs` 和 `vue-stomp`(这是一个封装StompJSVue 插件): ``` npm install stompjs vue-stomp --save ``` 2. **配置WebSocket连接**:创建一个 WebSocket 连接到 RabbitMQ服务器。这通常在 Vue 的单文件组件(.vue)中或者一个专门的服务模块里完成。例如: ```javascript import { StompClient } from 'vue-stomp'; export default { data() { return { stompClient: null, }; }, mounted() { this.stompClient = new StompClient('ws://your-rabbitmq-url'); this.stompClient.connect({ heartbeats: [5000, 5000] }, () => { // 连接成功后,你可以开始发送和接收消息 console.log('Connected to RabbitMQ'); }); }, beforeDestroy() { if (this.stompClient) { this.stompClient.disconnect(); } }, }; ``` 3. **消息发送和接收**:使用 `stompClient.send()` 发送消息到特定的 RabbitMQ queue,使用 `stompClient.subscribe()` 来接收从特定queue发来的消息。 4. **事件处理器**:处理接收到的Stomp消息,可以绑定到组件的某个方法上,更新视图或执行其他业务操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值