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();
相关推荐
这个DBA有点耶13 小时前
分布式集群的“最后一公里”:分片集群与透明分布式集群的工程代价拆解
数据库·分布式·架构
一条闲鱼_mytube15 小时前
分布式 ID 生成方案:雪花算法与号段模式
分布式·算法·wpf
科学熊16 小时前
Java 分布式理论与高并发编程
java·开发语言·分布式
MasonYyp18 小时前
安装npm依赖仓库Verdaccio
前端·npm·node.js
XMAIPC_Robot21 小时前
NXP i.MX95 + FPGA 异构计算平台 — 工业多域融合 AI 加速嵌入式控制解决方案
人工智能·分布式·fpga开发·能源·rk3576+fpga
方方洛1 天前
ray教程-13-RayTrain与分布式训练
人工智能·分布式·机器学习
黄俊懿2 天前
【架构师从入门到进阶】第七章:缓存和存储的优化思路——第一节:缓存概述
数据结构·数据库·分布式·缓存·架构·系统架构·1024程序员节
红海云2 天前
两台DGX Spark部署DeepSeek的实战边界
大数据·分布式·spark
编程的一拳超人2 天前
【元宝搜索开发者征文大赛】四语实战:Java/Python/Go/Node.js 构建 AI 搜索应用全攻略
java·python·golang·node.js·agent
lucas_AI2 天前
今年 2 月就修好的漏洞,10 月才炸:HTTP2Shell 把 Node、Python 一锅端
node.js