rabbitMQ+vue3实现stomp协议消息推送

1. 下载 stompjs 依赖

npm install stompjs

2. 创建消息队列配置文件

let type = 'test'
export const RMQ_SERVER = type == 'test' ? 'xx:xx:xx:xx:xxxx' : 'xx:xx:xx:xx:xxxx' // mq服务地址
export const RMQ_VIRTUAL_HOST = type == 'test' ? '/' : '/' //虚拟主机
export const RMQ_ACCOUNT = type == 'test' ? 'xxxxx' : 'xxxxx' // 用户名
export const RMQ_PASSWORD = type == 'test' ? 'xxxxxxx' : 'xxxxxxx' // 密码

3. mq连接文件

import Stomp from 'stompjs'
import {
  RMQ_SERVER,
  RMQ_VIRTUAL_HOST,
  RMQ_ACCOUNT,
  RMQ_PASSWORD,
} from './golbal'
import { getQueue } from '@/api/queue'
import router from '@/router'
import { downloadURL } from '@/config'
import { ElNotification } from 'element-plus'

class StompClient {
  // eslint-disable-next-line space-before-function-paren
  constructor(rmqServer, rmqVirtualHost, rmqAccount, rmqPassword) {
    this.subscribes = '' // 订阅信息
    this.queueName = '' // 队列名
    this.client = null
    this.frame = null
    this.options = {
      vhost: rmqVirtualHost,
      incoming: 10000,
      outgoing: 10000,
      account: rmqAccount,
      pwd: rmqPassword,
      server: `ws://${rmqServer}/ws`,
    }
  }
  async getQueueName() {
    let res = await getQueue()
    if (res.code == 200) {
      this.queueName = res.data.name
    }
  }
  // eslint-disable-next-line no-unused-vars
  connect(options) {
    let mqUrl = this.options.server
    let 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连接
    let onConnect = async () => {
      console.log('stomp 连接成功!')
      this.subscribe()
    }
    // mq错误重新进行连接
    let 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() {
    if (!this.queueName) {
      return
    }
    this.client.subscribe(
      `/amq/queue/${this.queueName}`,
      this.onMessage.bind(this),
      this.onSubscribeFailed.bind(this)
    )
  }
  // 关闭mq连接
  closeConnect() {
    this.client.disconnect(() => {
      console.log('已关闭mq连接')
    })
  }
  onMessage(frame) {
    let data = JSON.parse(frame.body)
    let endStr = data.content ? data.content.split(',')[1] : ''
    let str = data.content
      ? '<span>' +
        data.content.split(',')[0] +
        ',' +
        endStr +
        '</span>'
      : ''
    ElNotification({
      title: data.title ? data.title : '温馨提示',
      message: str,
      dangerouslyUseHTMLString: true,
      type:
        data.levelId == 'ORDINARY'
          ? 'success'
          : data.levelId == 'CLAMANT'
          ? 'info'
          : data.levelId == 'URGENT'
          ? 'warning'
          : 'error',
      duration: 5000,
      position: 'top-right',
      onClick: () => {
        this.handleClick(data)
      },
    })
  }
  handleClick(data) {
    if (data.messageTypeId == 'file') {
      let url = downloadURL + data.link
      var x = new XMLHttpRequest()
      x.open('GET', url, true)
      let fileName = data.content.split('导出的')[1].split('已导出')[0]
      x.responseType = 'blob'
      x.onload = function () {
        let url = window.URL.createObjectURL(x.response)
        let a = document.createElement('a')
        a.href = url
        a.download = fileName // 名字可自定义
        a.click()
      }
      x.send()
    } else {
      router.push('/message/my-message')
    }
  }
  const Download = (data: any, FileName: any, MimeType: any) => {
     // 创建请求下载,否则下载的文件内容是文件地址
     var x = new XMLHttpRequest();
     x.open("GET", data, true);
     x.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;");//缺少这句,后台无法获取参数
     x.responseType = 'blob';
     x.onload = function (e) {
       download(x.response, FileName, MimeType);
     }
     x.send();
  }
  eslint-disable-next-line no-unused-vars
  onSubscribeFailed(frame) {
    console.log('rabbitmq subscribe failed')
  }
}
export default new StompClient(
  RMQ_SERVER,
  RMQ_VIRTUAL_HOST,
  RMQ_ACCOUNT,
  RMQ_PASSWORD
)

4. 加载连接服务器

// 引入js文件
import StompClient from '@/config/stomp-client.js'

// onMounted 配置
StompClient.getQueueName()
setTimeout(() => {
  StompClient.connect()
})

5. 退出系统时,断开连接

const disConnect = async () => {
    let res = await disconnectQueue()
    console.log(res)
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值