Vue3通过StompJS连接RabbitMQ实现

555 阅读2分钟

安装

npm install stompjs --save

具体实现

我这里新建了一个文件,里面单独写了实现的各个步骤。真正开发中可以封装成组件,然后引入

<template>
  <a-form :model="formState" :label-col="{ style: { width: '80px' } }" class="box">
    <a-form-item label="服务地址">
      <a-input v-model:value="formState.SERVICE" />
    </a-form-item>
    <a-form-item label="账号">
      <a-input v-model:value="formState.USERNAME" />
    </a-form-item>
    <a-form-item label="密码">
      <a-input v-model:value="formState.PASSWORD" />
    </a-form-item>
    <a-form-item label="topic">
      <a-input v-model:value="formState.topic" />
    </a-form-item>
    <a-form-item>
      <a-button type="primary" style="width: 100%; margin-top: 20px" @click="connect"
        >连接</a-button
      >
    </a-form-item>
    <a-button type="warn" style="width: 100%; margin-top: 20px" @click="offLine">断开连接</a-button>
  </a-form>
</template>

<script setup lang="ts">
import { message } from 'ant-design-vue'
import Stomp from 'stompjs'
import { ref } from 'vue'
// 创建客户端实例
let client: any = null
// 连接的地址ws只能本地连接
// 账号
// 密码
// topic
const formState = ref({
  SERVICE: 'ws://*******:15674/ws',
  USERNAME: '***',
  PASSWORD: '***',
  topic: '/exchange/exchange_pushmsg/rk_pushmsg',
})
//连接成功时的回调 同时订阅频道
const onConnected = (frame: any) => {
  // const topic = ref('/vECU')
  message.success('连接成功')
  client.subscribe(formState.value.topic, responseCallback, onFailed)
}
// 连接失败时的回调
const onFailed = (frame: any) => {
  message.error(JSON.stringify(frame))
}
//接收消息处理
const responseCallback = (frame: any) => {
  message.success(JSON.stringify(frame.body))
}
//初始化mqtt客户端,并连接mqtt服务
const connect = () => {
  client = Stomp.client(formState.value.SERVICE)
  // 去除控制台的提示
  // client.debug = () => {}
  const headers = {
    login: formState.value.USERNAME,
    passcode: formState.value.PASSWORD,
  }
  client.connect(headers, onConnected, onFailed)
}
const offLine = () => {
  client.disconnect(() => {
    message.warning('连接已断开')
  })
}
// connect()
</script>

<style lang="scss" scoped>
.box {
  width: 500px;
  height: 300px;
  margin: 100px auto;
  background: #fff;
  padding: 20px;
}
</style>

遇到问题:连接不上
开始时给的http的地址,连接不上。
后面换了ws的地址也是连接不上,ws只能连接本地或者http。

topic配置

登录RabbitMQ
找到交换机
虚拟主机默认的是 /, 所以地址首先是 /exchange

image.png 其次往下面找,这里是配置一个交换机,其他不动,这里写入交换机的名字

image.png 点击 add
上面的列表里面会多出一个
交换机名称是exchange_pushmsg,所以地址是 /exchange/exchange_pushmsg

image.png 点击列表里面的这个交换机的名字,进入route的配置

image.png

推送消息可以通过这个终端的看板也可以通过后端

route名称是rk_pushmsg,所以地址是 /exchange/exchange_pushmsg/rk_pushmsg

最后配置的topic地址就是 /exchange/exchange_pushmsg/rk_pushmsg

连接成功的结果就是

image.png

借鉴链接
借鉴链接