当前位置: 首页 > news >正文

【Express.js】集成RabbitMQ

集成RabbitMQ

本节我们介绍在 express.js 中集成 rabbitmq.

RabbitMQ 是一个消息队列中间件,常用于请求削峰,事务的队列处理,事件订阅机制的实现等。

准备工作

  • 创建一个 express.js 项目(本文基于evp-express-cli)
  • 在开发环境下安装rabbitmq
  • 安装amqplib.js:
npm i amqplib

创建代理

正常的项目都是分层的,为了避免循环依赖,本文采用代理类构造单例的方式来创建ampqlib连接。

redisProxy.js:
在构造器内创建redis连接,并监听个别事件,最后把连接赋给client成员变量。再定义一个静态的获取实例方法,调用时实例若为空,就构建实例:

const amqplib = require('amqplib');
const logger = require('./logger');class RabbitmqProxy {/**@type {RabbitmqProxy}*/_instance = null;/**@type {amqplib.Connection}*/conn;/**@type {amqplib.Channel}*/channel;static async instance() {if (!this._instance) {let ins = new RabbitmqProxy();const conn = await amqplib.connect({username: `guest`,password: `guest`,hostname: `127.0.0.1`,port: `5672`,});logger.info("Connected to RabbitMQ!");ins.conn = conn;const channel = await ins.conn.createChannel();//确认队列channel.assertQueue("hellos");//订阅队列channel.consume("hellos", async (message) => {console.log("hello, two!");channel.ack(message); //报告处理完毕});ins.channel = channel;this._instance = ins;}return this._instance;}
}

amqplib创建rabbitmq连接是异步的,所以获取实例的静态方法也是异步的,如果你想转为同步函数,只能通过进程阻塞的方式实现。上面给我们的rabbitmq客户端订阅了一个hellos队列。

然后把rabbitmq导出来:

async function init() {return RedisProxy.instance();
}module.exports = {init,instance: RedisProxy.instance(),
};

然后在任意其它地方调用 await rabbitmqProxy.instance 即可获取单例,在从单例中获取conn和channel即可操作rabbitmq.

const rabbitmqProxy = require('../utils/rabbitmqProxy');app.post('/', async(req,res,next)=>{const rbmqproxy = await rabbitmqProxy.instance;const channel = rbmqproxy.channel;//发送消息到"hellos"队列channel.sendToQueue("hellos", "hello!");res.send();
})

你可以自己手动配置一遍,也可以使用evp-express-cli作为手脚架创建项目并选择rabbitmq模板。

关于amqplib.js的详细用法请见官方文档: http://npmjs.com/package/amqplib

下一节-集成Websocket

http://www.lryc.cn/news/122062.html

相关文章:

  • UI美工设计岗位的基本职责概述(合集)
  • 最强自动化测试框架Playwright(23)-API测试
  • k8s 自身原理 4
  • ZLMediaKit(webrtc)在linux上(CentOS7)部署与启动
  • 汽车基础软件新「战争」:群雄混战,谁在抢跑?
  • 阿里云预装LAMP应用导致MySQL不显示访问密码如何解决
  • SQL 自动清除7天前数据前收缩数据库
  • LangChain-ChatGLM在WIndows10下的部署
  • Telerik UI for ASP.NET Core Crack
  • 【TypeScript】中关于 { 声明合并 } 的使用及注意事项
  • Day 43
  • 服务器安全需要注意的几个方面?
  • Mysql数据库第十三课-----------sql语句的拔高3--------直冲云霄
  • 计算机网络-物理层(一)物理层的概念与传输媒体
  • 差分升级在物联网水表上的实现与应用(学习)
  • ubuntu磁盘管理
  • 前端处理后端返回的数据中有\n\n字样的换行符标识
  • matlab解常微分方程常用数值解法2:龙格库塔方法
  • 数据结构-栈(C语言简单实现)
  • 山东布谷科技直播软件源码探索高效、稳定直播传输的技术介绍:流媒体传输技术
  • LeetCode 热题 100 JavaScript -- 74. 搜索二维矩阵
  • 任我行 CRM SQL注入漏洞复现(HW0day)
  • [CKA]考试之集群故障排查 – kubelet故障
  • VBA技术资料MF42:VBA_从Excel中上面的单元格复制公式
  • ORB-SLAM2第一节---单目地图初始化
  • Postman 汉化及下载
  • 【运维】Zabbix简介及其应用领域
  • vue 设置了表单验证的el-input,在触发验证后无法继续输入的问题解决
  • 基于smardaten无代码开发智能巡检系统,让无人机飞得更准
  • 51项目——智能垃圾桶