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 小时前
Kafka偏移量管理全攻略:从基础概念到高级操作实战
分布式·kafka
怠惰_u7 小时前
使用Redis实现分布式锁,基于原本单体系统进行业务改造
数据库·redis·分布式
飞的肖9 小时前
采用分布式部署deepseek
分布式·deepseek
Pitayafruit11 小时前
【📕分布式锁通关指南 02】基于Redis实现的分布式锁
redis·分布式·后端
disgare11 小时前
Hadoop 基础原理
大数据·hadoop·分布式
m0_7482455212 小时前
使用 Docker 部署 RabbitMQ 的详细指南
docker·容器·rabbitmq
Linux运维技术栈12 小时前
RabbitMQ 3.12.2:单节点与集群部署实战指南
运维·分布式·rabbitmq
明达技术13 小时前
分布式 IO 模块:食品罐装产线自动化与高效运行的推手
运维·分布式·自动化
图梓灵15 小时前
RabbitMQ
java·rabbitmq·java-rabbitmq
dvlinker15 小时前
大数据技术Kafka详解 ⑥ | Kafka大厂面试题
大数据·kafka·消息队列·rabbitmq·分布式发布订阅系统·kfaka大厂面试题