【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.pswp.cn/news/34971.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/34971.shtml
英文地址,請注明出處:http://en.pswp.cn/news/34971.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【三維編輯】Seal-3D:基于NeRF的交互式像素級編輯

文章目錄 摘要一、引言二、方法2.1.基于nerf的編輯問題概述2.2.編輯指導生成2.3.即時預覽的兩階段學生訓練 三、實驗四、代碼總結 項目主頁: https://windingwind.github.io/seal-3d/ 代碼:https://github.com/windingwind/seal-3d/ 論文: https://arxiv.org/pdf/23…

創建一個Spring Boot項目

安裝所需軟件:首先確保你的計算機上已經安裝了Java JDK和Maven構建工具。你可以從官方網站下載并按照說明進行安裝。 創建一個新的Spring Boot項目:在命令行或終端中使用Maven命令創建一個新的Spring Boot項目。執行以下命令:mvn archetype:…

阿里云輕量應用服務器_2核4G4M_2核2G3M_性能測評

阿里云輕量應用服務器2核2G3M帶寬108元一年,系統盤為50GB高效云盤;輕量服務器2核4G4M帶寬,60GB高效云盤297.98元12個月。目前輕量應用服務器只有2核2G和2核4G有活動,阿里云百科分享阿里云輕量應用服務器入口: 目錄 阿…

【Qt高階】老Qt都不一定清楚的“QObject線程親和性”【2023.08.13】

老Qt都不一定清楚的“線程親和性” 與題目無關 感覺自己還挺2,有粉絲點了那個契約者會給up發個鼓勵的話,我還以為是人私信發的,都挨個感謝了,后來才意識到是系統自動發的😣😣😣。 自上上期視頻對…

Three.js陰影

目錄 Three.js入門 Three.js光源 Three.js陰影 Three.js紋理貼圖 使用燈光后,場景中就會產生陰影。物體的背面確實在黑暗中,這稱為核心陰影(core shadow)。我們缺少的是落下的陰影(drop shadow)&#…

【數據結構】——棧、隊列的相關習題

目錄 題型一(棧與隊列的基本概念)題型二(棧與隊列的綜合)題型三(循環隊列的判空與判滿)題型四(循環鏈表表示隊列)題型五(循環隊列的存儲)題型六(循…

一文揭秘餓了么跨端技術的演進、實踐與落地

跨端技術背景與演進歷程 跨端,究竟跨的是哪些端? 自 90 年的萬維網出現,而后的三十多年,我們依次經歷了 PC 時代、移動時代,以及現在的萬物互聯(的 IoT )時代,繁榮的背后&#xff…

【Apollo】Apollo-ros版本架構學習與源碼分析

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 這篇文章主要介紹Apollo-ros版本架構學習與源碼分析。 無專精則不能成,無涉獵則不能通。——梁啟超 歡迎來到我的博客,一起學習,共同進步。 喜歡的朋友可以關注一下&a…

微信小程序如何自定義分享卡片文案和圖片

微信小程序提供了onShareAppMessage方法,專門用來監聽用戶點擊頁面內轉發按鈕(button 組件 open-type"share")或右上角菜單“轉發”按鈕的行為,并自定義轉發內容。 > 注意:只有定義了此事件處理函數&…

Android studio 設置安卓手機

參考這個鏈接 ghttps://developer.android.com/studio/debug/dev-options 列出常用手機的設置,但是我的手機不在此列 Google Pixel Settings > About phone > Build number Samsung Galaxy S8 and later Settings > About phone > Software informa…

git: ‘lfs‘ is not a git command. see ‘git --help‘

在克隆hugging face里面的項目文件的時候,需要用到git lfs,本文介紹安裝git lfs方法 在Ubuntu下 curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash sudo apt-get install git-lfs在Windows下 到這個鏈…

解決GitHub的速度很慢的幾種方式

1. GitHub 鏡像訪問 這里提供兩個最常用的鏡像地址: https://hub.njuu.cf/search https://www.gitclone.com/gogs/search/clonesearch 也就是說上面的鏡像就是一個克隆版的 GitHub,你可以訪問上面的鏡像網站,網站的內容跟 GitHub 是完整同步…

期權定價模型系列【4】—期權組合的Delta-Gamma-Vega中性

期權組合的Delta-Gamma-Vega中性 期權組合構建時往往會進行delta中性對沖,在進行中性對沖后,期權組合的delta敞口為0,此時期權組合仍然存在gamma與vega敞口。因此研究期權組合的delta-gamma-vega敞口中性是有必要的。 本文旨在對delta-gamma-…

關于新手學習STM32開發應該如何入門?

對于新手來說,學習STM32開發可能會感到困惑,尤其是在拿到開發板后該如何入門。在這里有嵌入式學習路線,畢設,各種項目,需要留個6。以下是部分內容概述:硬件介紹:了解STM32開發板的基本硬件組成和…

Springboot 默認路徑說明

Spring Boot基本上是Spring框架的擴展,它消除了設置Spring應用程序所需的樣板配置,極大的方便了開發者,其默認識別路徑如下: Spring Boot 作為Spring默認將 /** 所有訪問映射到以下目錄: 1、classpath:/static 用于加…

【密碼學】穴居人密碼

穴居人密碼 文字記載中,有時會把來自古希臘文化之前的各種記錄作為密碼學的例子,但稱它們為密碼學一定太不嚴格了,這是因為那些方法都太原始了。密碼學的起源能追溯到多早,取決于你把密碼學的相關定義確定得有多寬泛。大多數作者都…

每日后端面試5題 第四天

1. 線程池的核心參數(高薪常問) (1)corePoolSize:核心線程個數 (2)maximumPoolSize:最大線程個數 (3)keepAliveTime:最大存活時間 &#xff0…

如何在Vue中進行單元測試?什么是Vue的模塊化開發?

1、如何在Vue中進行單元測試? 在Vue中進行單元測試可以提高代碼的可維護性和可讀性,同時也能夠幫助開發者更快地找到代碼中的問題和潛在的錯誤。下面是一些在Vue中進行單元測試的步驟: 安裝單元測試工具 首先需要安裝一個單元測試工具&…

第8章 【C語言】善于利用指針

8.1 指針是什么 由于通過地址能找到所需的變量單元,可以說,地址指向該變量單元。將地址形象化稱為“指針”。 直接按變量名進行的訪問,稱為“直接訪問”方式。 還可以采用另一種稱為“間接訪問”的方式,即將變量i的地址存放在另…

如何讓你的圖片服務也有類似OSS的圖片處理功能

原文鏈接 前言 有自己機房的公司一般都有一套存儲系統用于存儲公司的圖片、視頻、音頻、文件等數據,常見的存儲系統有以NAS、FASTDFS為代表的傳統文件存儲,和以Minio為代表的對象存儲系統,隨著云服務的興起很多公司逐漸將數據遷移到以阿里云…