RabbitMQ之Plugins插件----AMQP对接MQTT

1.启用插件

javascript 复制代码
rabbitmq-plugins enable rabbitmq_mqtt

2.检查是否启动成功,打开rabbitmq后台

3.概念:

AMQP是由交换器和queue队列组成的消息队列机制,MQTT是由订阅主题组成的消息机制

1.MQTT创建连接时会向rabbitmq创建一个自己的queue,默认使用**amq.topic交换器,**由mqtt-subscription-***-qos1组成queue名。其中qos概念自行了解。

2.AMQP连接消费也需要绑定到MQTT对应的交换器和队列中,其中routingKey则使用MQTT订阅主题。

上代码:

javascript 复制代码
//****************************************************************** */
//MQTT

const mqtt = require("mqtt")
const client = mqtt.connect({
    url: "mqtt://127.0.0.1:1883",
    clientId: 'nickchen111', // 客户端ID,此ID可自定义。queue后缀
    username: 'guest',   // 用户名
    password: 'guest'
}) // 连接到mqtt服务器

var quque = "device_aaa"
var quque_rpc = "device_aaa_rpc";
client.subscribe(quque_rpc, { qos: 1 })

var status = false;
var count = 0;
var error = 0;
setInterval(() => {
    if (status) {
        count += 1;
        var msg = Math.ceil(Math.random() * 40)
        console.log("MQTT发送消息:" + msg)
        client.publish(quque, msg.toString(), { qos: 0, retain: true })
    }
}, 3000);

client.on("message", function (top, message) {
    if (top == "device_aaa") {
        error += 1;
    }
    console.log("MQTT接收消息:" + top + "  : " + message.toString() + "*******丢失返回消息共:[" + error + "]条")
    if (JSON.parse(message.toString()).command == "stop") {
        status = false;
    }
    if (JSON.parse(message.toString()).command == "start") {
        status = true;
    }
})


//****************************************************************** */
//AMQP
const amqp = require('amqplib');

async function consumer() {
    // 创建链接对象
    const connection = await amqp.connect('amqp://localhost:5672');
    // 获取通道
    const channel = await connection.createChannel();
    // 声明参数
    const exchangeName = 'amq.topic';
    const queueName = 'mqtt-subscription-nickchen111qos1';
    const routingKey = 'device_aaa';
    // // 声明一个交换机
    // await channel.assertExchange(exchangeName, 'amq.topic', { durable: true });//消息持久化
    // // 声明一个队列
    await channel.assertQueue(queueName, { autoDelete: true, durable: true });
    // 绑定关系(队列、交换机、路由键)
    await channel.bindQueue(queueName, exchangeName, routingKey);
    var data = await channel.publish(exchangeName, "device_aaa_rpc", Buffer.from(JSON.stringify({ command: "start" })))
    // 消费
    await channel.consume(queueName, msg => {
        console.log('Consumer:', msg.content.toString());
        channel.ack(msg);
    },{ noAck: false });//开启通知
    console.log('消费端启动成功!');
}
consumer();
相关推荐
Rain50912 小时前
mini-cc 技术栈:跟着 Claude Code 先选 TypeScript + React + Ink
前端·javascript·react.js·typescript·node.js·ai编程
未若君雅裁12 小时前
分布式接口幂等性设计:唯一索引、Token 与分布式锁
分布式·微服务
还在忙碌的吴小二12 小时前
TLog 分布式日志追踪新手入门指南
分布式
轻刀快马12 小时前
从底层 CPU 架构看透现代分布式与并发编程
分布式·架构·cpu
晚烛12 小时前
CANN 分布式通信与 HCCL:多 NPU 协作的底层机制
开发语言·人工智能·分布式·python·深度学习
Rain50912 小时前
架构解密:mini-cc 的核心设计思路
前端·架构·开源·node.js·ai编程
青云计划12 小时前
分布式单飞锁
分布式
会编程的土豆12 小时前
Kafka 零基础入门(最基本用法)
分布式·kafka
yantuguiguziPGJ13 小时前
WeMed:一个医疗垂直领域大模型 问答系统的 Taro 小程序
typescript·node.js
会编程的土豆13 小时前
Kafka 入门笔记(核心语法 + 用法)
笔记·分布式·kafka