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();
相关推荐
大家的林语冰5 分钟前
✌️ Deno 2.9 来了,ESM 直接导入 CSS,甚至能开发桌面应用?!
前端·javascript·node.js
csdn2015_3 小时前
kafka如何确保消息不丢失
数据库·分布式·kafka
952363 小时前
RabbitMQ - 高级特性
java·spring boot·分布式·后端·rabbitmq
Database_Cool_4 小时前
阿里云 PolarDB-X vs TiDB 分布式数据库选型指南
数据库·分布式·阿里云·tidb
数据库小学妹4 小时前
分布式数据库架构怎么选?三种路线对比+迁移避坑指南
数据库·分布式·分布式数据库·数据库架构·数据迁移·数据库选型
大师兄66684 小时前
HarmonyOS7 分布式流转:手机到平板无缝接续案例
分布式·跨设备·harmonyos7·分布式流转
一只积极向上的小咸鱼4 小时前
多机Docker + InfiniBand 分布式运行实操手册
分布式·docker·容器
AndrewHZ5 小时前
【LLM技术全景】混合精度与分布式训练:训练大模型的工程奥秘
人工智能·分布式·深度学习·算法·ai·语言模型·llm
laoli_coding13 小时前
如何配置HTTPS站点访问的免费SSL域名证书
网络协议·https·node.js·ssl
To_OC13 小时前
手写 AI 编程 Agent 的命令执行工具:我被 child_process 坑出来的实战经验
后端·node.js·agent